U-Boot
Threads by month
- ----- 2025 -----
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2000 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
December 2011
- 189 participants
- 543 discussions

25 Jan '13
Chips supported:-
1. 88E6161 6 port gbe swtich with 5 integrated PHYs
2. 88E6165 6 port gbe swtich with 5 integrated PHYs
2. 88E6132 3 port gbe swtich with 2 integrated PHYs
Platform specific configuration supported
Note: This driver is supported and tested against
kirkwood egiga interface
Contributors:
Yotam Admon <yotam(a)marvell.com>
Michael Blostein <michaelbl(a)marvell.com
Reviewed by: Ronen Shitrit <rshitrit(a)marvell.com>
Signed-off-by: Prafulla Wadaskar <prafulla(a)marvell.com>
---
Changelog:-
v2: updated as per review comments for v1
removed other two drivers form earlier patch
debug_prints removed
driver moved to drivers/net/
v3: updated as per review comments for v2
miiphy interface used, platform specific dependency resolved
Chip id detection and printing added
common code forked out
some cosmetic and magic number fixes
v4: updated as per review comments for v3
mv88e61xx.h added
platform specific configuration support added
some more documentation references provided
cleaned rgmii delay enable related code
drivers/net/Makefile | 1 +
drivers/net/mv88e61xx.c | 296 +++++++++++++++++++++++++++++++++++++++++++++++
drivers/net/mv88e61xx.h | 73 ++++++++++++
3 files changed, 370 insertions(+), 0 deletions(-)
create mode 100644 drivers/net/mv88e61xx.c
create mode 100644 drivers/net/mv88e61xx.h
diff --git a/drivers/net/Makefile b/drivers/net/Makefile
index a360a50..7d397d6 100644
--- a/drivers/net/Makefile
+++ b/drivers/net/Makefile
@@ -46,6 +46,7 @@ COBJS-$(CONFIG_MACB) += macb.o
COBJS-$(CONFIG_MCFFEC) += mcffec.o mcfmii.o
COBJS-$(CONFIG_MPC5xxx_FEC) += mpc5xxx_fec.o
COBJS-$(CONFIG_MPC512x_FEC) += mpc512x_fec.o
+COBJS-$(CONFIG_MV88E61XX_SWITCH) += mv88e61xx.o
COBJS-$(CONFIG_NATSEMI) += natsemi.o
COBJS-$(CONFIG_DRIVER_NE2000) += ne2000.o ne2000_base.o
COBJS-$(CONFIG_DRIVER_AX88796L) += ax88796.o ne2000_base.o
diff --git a/drivers/net/mv88e61xx.c b/drivers/net/mv88e61xx.c
new file mode 100644
index 0000000..713e728
--- /dev/null
+++ b/drivers/net/mv88e61xx.c
@@ -0,0 +1,296 @@
+/*
+ * (C) Copyright 2009
+ * Marvell Semiconductor <www.marvell.com>
+ * Prafulla Wadaskar <prafulla(a)marvell.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 <common.h>
+#include <miiphy.h>
+#include "mv88e61xx.h"
+
+/* Chip Address mode
+ * The Switch support two modes of operation
+ * 1. single chip mode and
+ * 2. Multi-chip mode
+ * Refer section 9.2 &9.3 in chip datasheet-02 for more details
+ *
+ * By default single chip mode is configured
+ * multichip mode operation can be configured in board header
+ */
+#ifndef CONFIG_MV88E61XX_MULTICHIP_ADRMODE
+#define mv88e61xx_wr_phy miiphy_write
+#define mv88e61xx_rd_phy miiphy_read
+#else
+
+static int mv88e61xx_busychk_multic(u32 devaddr)
+{
+ u32 reg = 0;
+ u32 timeout = MV88E61XX_PHY_TIMEOUT;
+
+ /* Poll till SMIBusy bit is clear */
+ do {
+ miiphy_read(name, devaddr, 0x0, ®);
+ if (timeout-- == 0) {
+ printf("SMI busy timeout\n");
+ return -1;
+ }
+ } while (reg & BIT15);
+ return 0;
+}
+
+static void mv88e61xx_wr_phy(char *name, u32 phy_adr, u32 reg_ofs, u16 data)
+{
+ u16 reg;
+ u32 mii_dev_addr;
+
+ /* command to read PHY dev address */
+ miiphy_read(name, 0xEE, 0xEE, &mii_dev_addr);
+ mv88e61xx_busychk_multic(mii_dev_addr);
+ /* Write data to Switch indirect data register */
+ miiphy_write(name, mii_dev_addr, 0x1, data);
+ /* Write command to Switch indirect command register (write) */
+ miiphy_write(name, mii_dev_addr, 0x0,
+ reg_ofs | (phy_adr << 5) | BIT10 | BIT12 | BIT15);
+}
+
+static void mv88e61xx_rd_phy(char *name, u32 phy_adr, u32 reg_ofs, u16 * data)
+{
+ u16 reg;
+ u32 mii_dev_addr;
+
+ /* command to read PHY dev address */
+ miiphy_read(name, 0xEE, 0xEE, &mii_dev_addr);
+ mv88e61xx_busychk_multic(mii_dev_addr);
+ /* Write command to Switch indirect command register (read) */
+ miiphy_write(name, mii_dev_addr, 0x0,
+ reg_ofs | (phy_adr << 5) | BIT10 | BIT12 | BIT15);
+ mv88e61xx_busychk_multic(mii_dev_addr);
+ /* Read data from Switch indirect data register */
+ miiphy_read(name, mii_dev_addr, 0x1, (u16 *) & data);
+}
+#endif /* CONFIG_MV88E61XX_MULTICHIP_ADRMODE */
+
+static void mv88e61xx_vlaninit(struct mv88f61xx_config *swconfig,
+ u32 max_prtnum, u32 ports_ofs)
+{
+ u32 prt;
+ u16 reg;
+ char *name = swconfig->name;
+ u32 cpu_port = swconfig->cpuport;
+ u32 port_mask = swconfig->ports_enabled;
+
+ /* be sure all ports are disabled */
+ for (prt = 0; prt < max_prtnum; prt++) {
+ mv88e61xx_rd_phy(name, ports_ofs + prt, MV88E61XX_PRT_CTRL_REG,
+ ®);
+ reg &= ~0x3;
+ mv88e61xx_wr_phy(name, ports_ofs + prt, MV88E61XX_PRT_CTRL_REG,
+ reg);
+ }
+ /* Set CPU port VID to 0x1 */
+ mv88e61xx_rd_phy(name, (ports_ofs + cpu_port), MV88E61XX_PRT_VID_REG,
+ ®);
+ reg &= ~0xfff;
+ reg |= 0x1;
+ mv88e61xx_wr_phy(name, (ports_ofs + cpu_port), MV88E61XX_PRT_VID_REG,
+ reg);
+
+ /* Setting Port default priority for all ports to zero */
+ for (prt = 0; prt < max_prtnum; prt++) {
+ mv88e61xx_rd_phy(name, ports_ofs + prt, MV88E61XX_PRT_VID_REG,
+ ®);
+ reg &= ~0xc000;
+ mv88e61xx_wr_phy(name, ports_ofs + prt, MV88E61XX_PRT_VID_REG,
+ reg);
+ }
+ /* Setting VID and VID map for all ports except CPU port */
+ for (prt = 0; prt < max_prtnum; prt++) {
+ /* only for enabled ports */
+ if ((1 << prt) & port_mask) {
+ /* skip CPU port */
+ if (prt == cpu_port)
+ continue;
+
+ /*
+ * set Ports VLAN Mapping.
+ * port prt <--> cpu_port VLAN #prt+1.
+ */
+
+ mv88e61xx_rd_phy(name, ports_ofs + prt,
+ MV88E61XX_PRT_VID_REG, ®);
+ reg &= ~0x0fff;
+ reg |= (prt + 1);
+ mv88e61xx_wr_phy(name, ports_ofs + prt,
+ MV88E61XX_PRT_VID_REG, reg);
+
+ /*
+ * Set Vlan map table for all ports to send only to
+ * cpu_port
+ */
+ mv88e61xx_rd_phy(name, ports_ofs + prt,
+ MV88E61XX_PRT_VMAP_REG, ®);
+ reg &= ~((1 << max_prtnum) - 1);
+ reg |= (1 << cpu_port);
+ mv88e61xx_wr_phy(name, ports_ofs + prt,
+ MV88E61XX_PRT_VMAP_REG, reg);
+ }
+ }
+ /* Set Vlan map table for cpu_port to see all ports */
+ mv88e61xx_rd_phy(name, (ports_ofs + cpu_port), MV88E61XX_PRT_VMAP_REG,
+ ®);
+ reg &= ~((1 << max_prtnum) - 1);
+ reg |= port_mask & ~(1 << cpu_port);
+ mv88e61xx_wr_phy(name, (ports_ofs + cpu_port), MV88E61XX_PRT_VMAP_REG,
+ reg);
+
+ /*
+ * enable only appropriate ports to forwarding mode
+ * and disable the others
+ */
+ for (prt = 0; prt < max_prtnum; prt++) {
+ if ((1 << prt) & port_mask) {
+ mv88e61xx_rd_phy(name, ports_ofs + prt,
+ MV88E61XX_PRT_CTRL_REG, ®);
+ reg |= 0x3;
+ mv88e61xx_wr_phy(name, ports_ofs + prt,
+ MV88E61XX_PRT_CTRL_REG, reg);
+ } else {
+ /* Disable port */
+ mv88e61xx_rd_phy(name, ports_ofs + prt,
+ MV88E61XX_PRT_CTRL_REG, ®);
+ reg &= ~0x3;
+ mv88e61xx_wr_phy(name, ports_ofs + prt,
+ MV88E61XX_PRT_CTRL_REG, reg);
+ }
+ }
+}
+
+/*
+ * Make sure SMIBusy bit cleared before another
+ * SMI operation can take place
+ */
+static int mv88361xx_busychk(char *name)
+{
+ u32 reg = 0;
+ u32 timeout = MV88E61XX_PHY_TIMEOUT;
+ do {
+ mv88e61xx_rd_phy(name, MV88E61XX_GLB2REG_DEVADR,
+ MV88E61XX_PHY_CMD, (u16 *) & reg);
+ if (timeout-- == 0) {
+ printf("SMI busy timeout\n");
+ return -1;
+ }
+ } while (reg & BIT28); /* busy mask */
+ return 0;
+}
+
+/*
+ * Marvell 88E61XX Switch initialization
+ */
+int mv_switch_88e61xx_init(struct mv88f61xx_config *swconfig)
+{
+ u32 prt;
+ u16 reg;
+ char *idstr;
+ char *name = swconfig->name;
+
+ if (miiphy_set_current_dev(name)) {
+ printf("%s failed\n", __FUNCTION__);
+ return -1;
+ }
+
+ if (swconfig->mode != MV88F61XX_MODE_SW_MANAGEED) {
+ printf("Unsupported mode %s failed\n", __FUNCTION__);
+ return -1;
+ }
+
+ if (swconfig->cpuport < 4) {
+ swconfig->cpuport = 5;
+ printf("Invalid cpu port config, using default port5\n");
+ }
+
+ mv88e61xx_rd_phy(name, MV88E61XX_PRT_OFST, PHY_PHYIDR2, ®);
+ reg &= 0xfff0;
+ if (reg == 0x1610)
+ idstr = "88E6161";
+ if (reg == 0x1650)
+ idstr = "88E6165";
+ if (reg == 0x1210) {
+ idstr = "88E6123";
+ swconfig->ports_enabled &= 0x023; /* ports 2,3,4 no available */
+ }
+
+ /* Init vlan */
+ mv88e61xx_vlaninit(swconfig, MV88E61XX_MAX_PORTS_NUM,
+ MV88E61XX_PRT_OFST);
+
+ if (swconfig->rgmii_delay == MV88F61XX_RGMII_DELAY_EN) {
+ /*
+ * Enable RGMII delay on Tx and Rx for CPU port
+ * Ref: sec 9.5 of chip datasheet-02
+ */
+ mv88e61xx_wr_phy(name, MV88E61XX_PRT_OFST + 5,
+ MV88E61XX_RGMII_TIMECTRL_REG, 0x18);
+ mv88e61xx_wr_phy(name, MV88E61XX_PRT_OFST + 4,
+ MV88E61XX_RGMII_TIMECTRL_REG, 0xc1e7);
+ }
+
+ for (prt = 0; prt < MV88E61XX_MAX_PORTS_NUM; prt++) {
+ if (prt != swconfig->cpuport) {
+ /* Write Copper Specific control reg1 (0x14) for-
+ * Enable Phy power up
+ * Energy Detect on (sense&Xmit NLP Periodically
+ * reset other settings default
+ */
+ mv88e61xx_wr_phy(name, MV88E61XX_GLB2REG_DEVADR,
+ MV88E61XX_PHY_DATA, 0x3360);
+ mv88e61xx_wr_phy(name, MV88E61XX_GLB2REG_DEVADR,
+ MV88E61XX_PHY_CMD,
+ (0x9410 | (prt << 5)));
+
+ if (mv88361xx_busychk(name))
+ return -1;
+
+ /* Write PHY ctrl reg (0x0) to apply
+ * Phy reset (BIT15=low)
+ * reset other default values
+ */
+ mv88e61xx_wr_phy(name, MV88E61XX_GLB2REG_DEVADR,
+ MV88E61XX_PHY_DATA, 0x1140);
+ mv88e61xx_wr_phy(name, MV88E61XX_GLB2REG_DEVADR,
+ MV88E61XX_PHY_CMD,
+ (0x9400 | (prt << 5)));
+
+ if (mv88361xx_busychk(name))
+ return -1;
+ }
+
+ /*Program port state */
+ mv88e61xx_rd_phy(name, MV88E61XX_PRT_OFST + prt,
+ MV88E61XX_PRT_CTRL_REG, ®);
+ mv88e61xx_wr_phy(name, MV88E61XX_PRT_OFST + prt,
+ MV88E61XX_PRT_CTRL_REG,
+ reg | (swconfig->portstate & 0x03));
+ }
+
+ printf("%s Initialized on %s\n", idstr, name);
+ return 0;
+}
diff --git a/drivers/net/mv88e61xx.h b/drivers/net/mv88e61xx.h
new file mode 100644
index 0000000..f1c86a6
--- /dev/null
+++ b/drivers/net/mv88e61xx.h
@@ -0,0 +1,73 @@
+/*
+ * (C) Copyright 2009
+ * Marvell Semiconductor <www.marvell.com>
+ * Prafulla Wadaskar <prafulla(a)marvell.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 _MV88E61XX_H
+#define _MV88E61XX_H
+
+#define PORT(_x) (1 << _x)
+#define MV88E61XX_CPU_PORT 0x5
+#define MV88E61XX_MAX_PORTS_NUM 0x6
+
+#define MV88E61XX_PHY_TIMEOUT 100000
+
+#define MV88E61XX_PRT_STS_REG 0x1
+#define MV88E61XX_PRT_CTRL_REG 0x4
+#define MV88E61XX_PRT_VMAP_REG 0x6
+#define MV88E61XX_PRT_VID_REG 0x7
+
+#define MV88E61XX_PRT_OFST 0x10
+#define MV88E61XX_PHY_CMD 0x18
+#define MV88E61XX_PHY_DATA 0x19
+#define MV88E61XX_RGMII_TIMECTRL_REG 0x1A
+#define MV88E61XX_GLB2REG_DEVADR 0x1C
+
+/* constants for switch configuration */
+enum mv88f61xx_cfg_mode {
+ MV88F61XX_MODE_SW_MANAGEED,
+ MV88F61XX_MODE_SW_UNMANAGEED
+};
+
+enum mv88f61xx_cfg_rgmiid {
+ MV88F61XX_RGMII_DELAY_DIS,
+ MV88F61XX_RGMII_DELAY_EN
+};
+
+enum mv88f61xx_cfg_prtstt {
+ MV88E61XX_PORTSTT_DISABLED,
+ MV88E61XX_PORTSTT_BLOCKING,
+ MV88E61XX_PORTSTT_LEARNING,
+ MV88E61XX_PORTSTT_FORWARDING
+};
+
+/* switch configuration structure */
+struct mv88f61xx_config {
+ char *name;
+ enum mv88f61xx_cfg_mode mode;
+ enum mv88f61xx_cfg_rgmiid rgmii_delay;
+ enum mv88f61xx_cfg_prtstt portstate;
+ u32 ports_enabled;
+ u8 cpuport;
+};
+
+#endif /* _MV88E61XX_H */
--
1.5.3.3
5
11
Hi u-boot,
I see u-boot supports readonly serial# and ethaddr, but I have a few
other variables that I need to be read-only. I'm planning to
implement a generic list of variables that cannot be changed or
deleted.
I'm interested to know what sort of specification people would find
most appropriate. My current thought is to follow the same delimiter
as the env itself, i.e. null separated list with double null
terminator. This list would then be defined in the board config
header. It also seems that you should be able to specify simple
access rules for each variable name perhaps using "=<val>" after each
var name where <val> could have constants (probably numbers for
performance, but could be string literals) to define modes. Right now
I'm thinking read-only, create-only, change-default, and change-only
(i.e no delete) are the modes that make sense.
I'm also interested if anyone would be opposed to simply using this
new specification of readonly vars to implement the serial# and
ethaddr protection. The CONFIG_HAS_UID is a bit odd... should that be
available in general for read-only vars?
Comments?
Thanks,
-Joe
10
123
With the new threats like Stuxnet and Duqu one need to improve on how new
updates to software is distrubuted to devcies so one can
be sure that it's not a hacked or modified software that runs in the
device. We use uboot + usb stick to update the software in our devices.
Have anyone been trying out to add e.g cryptated,certificates or rsa keys
to uboot?
5
6

23 Nov '12
Hi,
I am porting UBoot on S3C2450 and has an USB issue. Here is an error
message:
ERROR: CTL:TIMEOUT
USB device not responding, giving up (status=20)
2 USB Device(s) found
scanning bus for storage devices...
0 Storage Device(s) found
The problem seems submit_common_msg couldn't get description of USB flash
memory device
Could I have help? Please tell me if you had this issue before. Thank you
for your helping
Here is a log data
usb start
(Re)start USB...
USB: INFO: aligned ghcca c3e4f900
DEBUG: USB HC reset_hc usb-smdk2450: ctrl = 0x9F ;
DEBUG: OHCI controller usb-smdk2450 state
DEBUG: control: 0x0000008f HCFS=operational IE PLE CBSR=3
DEBUG: cmdstatus: 0x00000000 SOC=0
DEBUG: intrstatus: 0x00000044 RHSC SF
DEBUG: intrenable: 0x00000053 RHSC UE WDH SO
DEBUG: hcca frame #0000
DEBUG: roothub.a: 02001202 POTPGT=2 NOCP NPS NDP=2
DEBUG: roothub.b: 00000000 PPCM=0000 DR=0000
DEBUG: roothub.status: 00000000
DEBUG: roothub.portstatus [0] = 0x00010101 CSC PPS CCS
DEBUG: roothub.portstatus [1] = 0x00000100 PPS
scanning bus for devices... New Device 0
start 0st usb_new_device
usb_control_msg: request: 0x6, requesttype: 0x80
value 0x100 index 0x0 length 0x40
INFO: submit_control_msg
DEBUG: SUB URB:[ 0] dev: 0,ep: 0-I,type:CTRL,len:0/64 stat:0x80000000
DEBUG: SUB(rh) URB:[ 0] dev: 0,ep: 0-I,type:CTRL,len:0/64 stat:0x80000000
INFO: Root-Hub: adr: 0 cmd(8): 00000680 0100 0000 0040
DEBUG: roothub.a: 02001202 POTPGT=2 NOCP NPS NDP=2
DEBUG: roothub.b: 00000000 PPCM=0000 DR=0000
DEBUG: roothub.status: 00000000
DEBUG: roothub.portstatus [0] = 0x00010101 CSC PPS CCS
DEBUG: roothub.portstatus [1] = 0x00000100 PPS
DEBUG: RET(rh) URB:[ 0] dev: 0,ep: 0-I,type:CTRL,len:64/64 stat:0x0
start 1st usb_new_device
usb_control_msg: request: 0x6, requesttype: 0x80
value 0x100 index 0x0 length 0x40
INFO: submit_control_msg
DEBUG: SUB URB:[ 0] dev: 0,ep: 0-I,type:CTRL,len:0/64 stat:0x80000000
DEBUG: SUB(rh) URB:[ 0] dev: 0,ep: 0-I,type:CTRL,len:0/64 stat:0x80000000
INFO: Root-Hub: adr: 0 cmd(8): 00000680 0100 0000 0040
DEBUG: roothub.a: 02001202 POTPGT=2 NOCP NPS NDP=2
DEBUG: roothub.b: 00000000 PPCM=0000 DR=0000
DEBUG: roothub.status: 00000000
DEBUG: roothub.portstatus [0] = 0x00010101 CSC PPS CCS
DEBUG: roothub.portstatus [1] = 0x00000100 PPS
DEBUG: RET(rh) URB:[ 0] dev: 0,ep: 0-I,type:CTRL,len:64/64 stat:0x0
start 2st usb_new_device
usb_control_msg: request: 0x6, requesttype: 0x80
value 0x100 index 0x0 length 0x40
INFO: submit_control_msg
DEBUG: SUB URB:[ 0] dev: 0,ep: 0-I,type:CTRL,len:0/64 stat:0x80000000
DEBUG: SUB(rh) URB:[ 0] dev: 0,ep: 0-I,type:CTRL,len:0/64 stat:0x80000000
INFO: Root-Hub: adr: 0 cmd(8): 00000680 0100 0000 0040
DEBUG: roothub.a: 02001202 POTPGT=2 NOCP NPS NDP=2
DEBUG: roothub.b: 00000000 PPCM=0000 DR=0000
DEBUG: roothub.status: 00000000
DEBUG: roothub.portstatus [0] = 0x00010101 CSC PPS CCS
DEBUG: roothub.portstatus [1] = 0x00000100 PPS
DEBUG: RET(rh) URB:[ 0] dev: 0,ep: 0-I,type:CTRL,len:64/64 stat:0x0
set address 1
usb_control_msg: request: 0x5, requesttype: 0x0
value 0x1 index 0x0 length 0x0
INFO: submit_control_msg
DEBUG: SUB URB:[ 0] dev: 0,ep: 0-O,type:CTRL,len:0/0 stat:0x80000000
DEBUG: SUB(rh) URB:[ 0] dev: 0,ep: 0-O,type:CTRL,len:0/0 stat:0x80000000
INFO: Root-Hub: adr: 1 cmd(8): 00000500 0001 0000 0000
DEBUG: roothub.a: 02001202 POTPGT=2 NOCP NPS NDP=2
DEBUG: roothub.b: 00000000 PPCM=0000 DR=0000
DEBUG: roothub.status: 00000000
DEBUG: roothub.portstatus [0] = 0x00010101 CSC PPS CCS
DEBUG: roothub.portstatus [1] = 0x00000100 PPS
DEBUG: RET(rh) URB:[ 0] dev: 0,ep: 0-O,type:CTRL,len:0/0 stat:0x0
usb_control_msg: request: 0x6, requesttype: 0x80
value 0x100 index 0x0 length 0x12
INFO: submit_control_msg
DEBUG: SUB URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:0/18 stat:0x80000000
DEBUG: SUB(rh) URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:0/18 stat:0x80000000
INFO: Root-Hub: adr: 1 cmd(8): 00000680 0100 0000 0012
DEBUG: roothub.a: 02001202 POTPGT=2 NOCP NPS NDP=2
DEBUG: roothub.b: 00000000 PPCM=0000 DR=0000
DEBUG: roothub.status: 00000000
DEBUG: roothub.portstatus [0] = 0x00010101 CSC PPS CCS
DEBUG: roothub.portstatus [1] = 0x00000100 PPS
DEBUG: RET(rh) URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:18/18 stat:0x0
usb_control_msg: request: 0x6, requesttype: 0x80
value 0x200 index 0x0 length 0x8
INFO: submit_control_msg
DEBUG: SUB URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:0/8 stat:0x80000000
DEBUG: SUB(rh) URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:0/8 stat:0x80000000
INFO: Root-Hub: adr: 1 cmd(8): 00000680 0200 0000 0008
DEBUG: roothub.a: 02001202 POTPGT=2 NOCP NPS NDP=2
DEBUG: roothub.b: 00000000 PPCM=0000 DR=0000
DEBUG: roothub.status: 00000000
DEBUG: roothub.portstatus [0] = 0x00010101 CSC PPS CCS
DEBUG: roothub.portstatus [1] = 0x00000100 PPS
DEBUG: RET(rh) URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:8/8 stat:0x0
usb_control_msg: request: 0x6, requesttype: 0x80
value 0x200 index 0x0 length 0x19
INFO: submit_control_msg
DEBUG: SUB URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:0/25 stat:0x80000000
DEBUG: SUB(rh) URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:0/25 stat:0x80000000
INFO: Root-Hub: adr: 1 cmd(8): 00000680 0200 0000 0019
DEBUG: roothub.a: 02001202 POTPGT=2 NOCP NPS NDP=2
DEBUG: roothub.b: 00000000 PPCM=0000 DR=0000
DEBUG: roothub.status: 00000000
DEBUG: roothub.portstatus [0] = 0x00010101 CSC PPS CCS
DEBUG: roothub.portstatus [1] = 0x00000100 PPS
DEBUG: RET(rh) URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:25/25 stat:0x0
get_conf_no 0 Result 25, wLength 25
if 0, ep 0
##EP epmaxpacketin[1] = 2
set configuration 1
usb_control_msg: request: 0x9, requesttype: 0x0
value 0x1 index 0x0 length 0x0
INFO: submit_control_msg
DEBUG: SUB URB:[ 0] dev: 1,ep: 0-O,type:CTRL,len:0/0 stat:0x80000000
DEBUG: SUB(rh) URB:[ 0] dev: 1,ep: 0-O,type:CTRL,len:0/0 stat:0x80000000
INFO: Root-Hub: adr: 1 cmd(8): 00000900 0001 0000 0000
INFO: WR:status 0x10000
DEBUG: roothub.a: 02001202 POTPGT=2 NOCP NPS NDP=2
DEBUG: roothub.b: 00000000 PPCM=0000 DR=0000
DEBUG: roothub.status: 00000000
DEBUG: roothub.portstatus [0] = 0x00010101 CSC PPS CCS
DEBUG: roothub.portstatus [1] = 0x00000100 PPS
DEBUG: RET(rh) URB:[ 0] dev: 1,ep: 0-O,type:CTRL,len:0/0 stat:0x0
new device strings: Mfr=0, Product=1, SerialNumber=0
usb_control_msg: request: 0x6, requesttype: 0x80
value 0x300 index 0x0 length 0xFF
INFO: submit_control_msg
DEBUG: SUB URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:0/255 stat:0x80000000
DEBUG: SUB(rh) URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:0/255 stat:0x80000000
INFO: Root-Hub: adr: 1 cmd(8): 00000680 0300 0000 00ff
DEBUG: roothub.a: 02001202 POTPGT=2 NOCP NPS NDP=2
DEBUG: roothub.b: 00000000 PPCM=0000 DR=0000
DEBUG: roothub.status: 00000000
DEBUG: roothub.portstatus [0] = 0x00010101 CSC PPS CCS
DEBUG: roothub.portstatus [1] = 0x00000100 PPS
DEBUG: RET(rh) URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:255/255 stat:0x0
USB device number 1 default language ID 0x409
usb_control_msg: request: 0x6, requesttype: 0x80
value 0x301 index 0x409 length 0xFF
INFO: submit_control_msg
DEBUG: SUB URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:0/255 stat:0x80000000
DEBUG: SUB(rh) URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:0/255 stat:0x80000000
INFO: Root-Hub: adr: 1 cmd(8): 00000680 0301 0409 00ff
DEBUG: roothub.a: 02001202 POTPGT=2 NOCP NPS NDP=2
DEBUG: roothub.b: 00000000 PPCM=0000 DR=0000
DEBUG: roothub.status: 00000000
DEBUG: roothub.portstatus [0] = 0x00010101 CSC PPS CCS
DEBUG: roothub.portstatus [1] = 0x00000100 PPS
DEBUG: RET(rh) URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:255/255 stat:0x0
Manufacturer
Product OHCI Root Hub
SerialNumber
usb_control_msg: request: 0x6, requesttype: 0xA0
value 0x2900 index 0x0 length 0x4
INFO: submit_control_msg
DEBUG: SUB URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:0/4 stat:0x80000000
DEBUG: SUB(rh) URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:0/4 stat:0x80000000
INFO: Root-Hub: adr: 1 cmd(8): 000006a0 2900 0000 0004
DEBUG: roothub.a: 02001202 POTPGT=2 NOCP NPS NDP=2
DEBUG: roothub.b: 00000000 PPCM=0000 DR=0000
DEBUG: roothub.status: 00000000
DEBUG: roothub.portstatus [0] = 0x00010101 CSC PPS CCS
DEBUG: roothub.portstatus [1] = 0x00000100 PPS
DEBUG: RET(rh) URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:4/4 stat:0x0
usb_control_msg: request: 0x6, requesttype: 0xA0
value 0x2900 index 0x0 length 0x9
INFO: submit_control_msg
DEBUG: SUB URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:0/9 stat:0x80000000
DEBUG: SUB(rh) URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:0/9 stat:0x80000000
INFO: Root-Hub: adr: 1 cmd(8): 000006a0 2900 0000 0009
DEBUG: roothub.a: 02001202 POTPGT=2 NOCP NPS NDP=2
DEBUG: roothub.b: 00000000 PPCM=0000 DR=0000
DEBUG: roothub.status: 00000000
DEBUG: roothub.portstatus [0] = 0x00010101 CSC PPS CCS
DEBUG: roothub.portstatus [1] = 0x00000100 PPS
DEBUG: RET(rh) URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:9/9 stat:0x0
usb_control_msg: request: 0x0, requesttype: 0xA0
value 0x0 index 0x0 length 0x4
INFO: submit_control_msg
DEBUG: SUB URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:0/4 stat:0x80000000
DEBUG: SUB(rh) URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:0/4 stat:0x80000000
INFO: Root-Hub: adr: 1 cmd(8): 000000a0 0000 0000 0004
DEBUG: roothub.a: 02001202 POTPGT=2 NOCP NPS NDP=2
DEBUG: roothub.b: 00000000 PPCM=0000 DR=0000
DEBUG: roothub.status: 00000000
DEBUG: roothub.portstatus [0] = 0x00010101 CSC PPS CCS
DEBUG: roothub.portstatus [1] = 0x00000100 PPS
DEBUG: RET(rh) URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:4/4 stat:0x0
usb_control_msg: request: 0x3, requesttype: 0x23
value 0x8 index 0x1 length 0x0
INFO: submit_control_msg
DEBUG: SUB URB:[ 0] dev: 1,ep: 0-O,type:CTRL,len:0/0 stat:0x80000000
DEBUG: SUB(rh) URB:[ 0] dev: 1,ep: 0-O,type:CTRL,len:0/0 stat:0x80000000
INFO: Root-Hub: adr: 1 cmd(8): 00000323 0008 0001 0000
INFO: WR:portstatus[0] 0x100
DEBUG: roothub.a: 02001202 POTPGT=2 NOCP NPS NDP=2
DEBUG: roothub.b: 00000000 PPCM=0000 DR=0000
DEBUG: roothub.status: 00000000
DEBUG: roothub.portstatus [0] = 0x00010101 CSC PPS CCS
DEBUG: roothub.portstatus [1] = 0x00000100 PPS
DEBUG: RET(rh) URB:[ 0] dev: 1,ep: 0-O,type:CTRL,len:0/0 stat:0x0
usb_control_msg: request: 0x3, requesttype: 0x23
value 0x8 index 0x2 length 0x0
INFO: submit_control_msg
DEBUG: SUB URB:[ 0] dev: 1,ep: 0-O,type:CTRL,len:0/0 stat:0x80000000
DEBUG: SUB(rh) URB:[ 0] dev: 1,ep: 0-O,type:CTRL,len:0/0 stat:0x80000000
INFO: Root-Hub: adr: 1 cmd(8): 00000323 0008 0002 0000
INFO: WR:portstatus[1] 0x100
DEBUG: roothub.a: 02001202 POTPGT=2 NOCP NPS NDP=2
DEBUG: roothub.b: 00000000 PPCM=0000 DR=0000
DEBUG: roothub.status: 00000000
DEBUG: roothub.portstatus [0] = 0x00010101 CSC PPS CCS
DEBUG: roothub.portstatus [1] = 0x00000100 PPS
DEBUG: RET(rh) URB:[ 0] dev: 1,ep: 0-O,type:CTRL,len:0/0 stat:0x0
usb_control_msg: request: 0x0, requesttype: 0xA3
value 0x0 index 0x1 length 0x4
INFO: submit_control_msg
DEBUG: SUB URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:0/4 stat:0x80000000
DEBUG: SUB(rh) URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:0/4 stat:0x80000000
INFO: Root-Hub: adr: 1 cmd(8): 000000a3 0000 0001 0004
DEBUG: roothub.a: 02001202 POTPGT=2 NOCP NPS NDP=2
DEBUG: roothub.b: 00000000 PPCM=0000 DR=0000
DEBUG: roothub.status: 00000000
DEBUG: roothub.portstatus [0] = 0x00010101 CSC PPS CCS
DEBUG: roothub.portstatus [1] = 0x00000100 PPS
DEBUG: RET(rh) URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:4/4 stat:0x0
usb_control_msg: request: 0x0, requesttype: 0xA3
value 0x0 index 0x1 length 0x4
INFO: submit_control_msg
DEBUG: SUB URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:0/4 stat:0x80000000
DEBUG: SUB(rh) URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:0/4 stat:0x80000000
INFO: Root-Hub: adr: 1 cmd(8): 000000a3 0000 0001 0004
DEBUG: roothub.a: 02001202 POTPGT=2 NOCP NPS NDP=2
DEBUG: roothub.b: 00000000 PPCM=0000 DR=0000
DEBUG: roothub.status: 00000000
DEBUG: roothub.portstatus [0] = 0x00010101 CSC PPS CCS
DEBUG: roothub.portstatus [1] = 0x00000100 PPS
DEBUG: RET(rh) URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:4/4 stat:0x0
usb_control_msg: request: 0x1, requesttype: 0x23
value 0x10 index 0x1 length 0x0
INFO: submit_control_msg
DEBUG: SUB URB:[ 0] dev: 1,ep: 0-O,type:CTRL,len:0/0 stat:0x80000000
DEBUG: SUB(rh) URB:[ 0] dev: 1,ep: 0-O,type:CTRL,len:0/0 stat:0x80000000
INFO: Root-Hub: adr: 1 cmd(8): 00000123 0010 0001 0000
INFO: WR:portstatus[0] 0x10000
DEBUG: roothub.a: 02001202 POTPGT=2 NOCP NPS NDP=2
DEBUG: roothub.b: 00000000 PPCM=0000 DR=0000
DEBUG: roothub.status: 00000000
DEBUG: roothub.portstatus [0] = 0x00000101 PPS CCS
DEBUG: roothub.portstatus [1] = 0x00000100 PPS
DEBUG: RET(rh) URB:[ 0] dev: 1,ep: 0-O,type:CTRL,len:0/0 stat:0x0
usb_control_msg: request: 0x3, requesttype: 0x23
value 0x4 index 0x1 length 0x0
INFO: submit_control_msg
DEBUG: SUB URB:[ 0] dev: 1,ep: 0-O,type:CTRL,len:0/0 stat:0x80000000
DEBUG: SUB(rh) URB:[ 0] dev: 1,ep: 0-O,type:CTRL,len:0/0 stat:0x80000000
INFO: Root-Hub: adr: 1 cmd(8): 00000323 0004 0001 0000
INFO: WR:portstatus[0] 0x10
DEBUG: roothub.a: 02001202 POTPGT=2 NOCP NPS NDP=2
DEBUG: roothub.b: 00000000 PPCM=0000 DR=0000
DEBUG: roothub.status: 00000000
DEBUG: roothub.portstatus [0] = 0x00100103 PRSC PPS PES CCS
DEBUG: roothub.portstatus [1] = 0x00000100 PPS
DEBUG: RET(rh) URB:[ 0] dev: 1,ep: 0-O,type:CTRL,len:0/0 stat:0x0
usb_control_msg: request: 0x0, requesttype: 0xA3
value 0x0 index 0x1 length 0x4
INFO: submit_control_msg
DEBUG: SUB URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:0/4 stat:0x80000000
DEBUG: SUB(rh) URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:0/4 stat:0x80000000
INFO: Root-Hub: adr: 1 cmd(8): 000000a3 0000 0001 0004
DEBUG: roothub.a: 02001202 POTPGT=2 NOCP NPS NDP=2
DEBUG: roothub.b: 00000000 PPCM=0000 DR=0000
DEBUG: roothub.status: 00000000
DEBUG: roothub.portstatus [0] = 0x00100103 PRSC PPS PES CCS
DEBUG: roothub.portstatus [1] = 0x00000100 PPS
DEBUG: RET(rh) URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:4/4 stat:0x0
usb_control_msg: request: 0x1, requesttype: 0x23
value 0x14 index 0x1 length 0x0
INFO: submit_control_msg
DEBUG: SUB URB:[ 0] dev: 1,ep: 0-O,type:CTRL,len:0/0 stat:0x80000000
DEBUG: SUB(rh) URB:[ 0] dev: 1,ep: 0-O,type:CTRL,len:0/0 stat:0x80000000
INFO: Root-Hub: adr: 1 cmd(8): 00000123 0014 0001 0000
INFO: WR:portstatus[0] 0x100000
DEBUG: roothub.a: 02001202 POTPGT=2 NOCP NPS NDP=2
DEBUG: roothub.b: 00000000 PPCM=0000 DR=0000
DEBUG: roothub.status: 00000000
DEBUG: roothub.portstatus [0] = 0x00000103 PPS PES CCS
DEBUG: roothub.portstatus [1] = 0x00000100 PPS
DEBUG: RET(rh) URB:[ 0] dev: 1,ep: 0-O,type:CTRL,len:0/0 stat:0x0
New Device 1
start 0st usb_new_device
usb_control_msg: request: 0x6, requesttype: 0x80
value 0x100 index 0x0 length 0x40
INFO: submit_control_msg
DEBUG: SUB URB:[ 0] dev: 0,ep: 0-I,type:CTRL,len:0/64 stat:0x80000000
DEBUG: SUB URB:[ 0] dev: 0,ep: 0-I,type:CTRL,len:0/64 stat:0x80000000
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
DEBUG: %
DEBUG: hc_interrupt: returning..
ERROR: hc_interrupt: returning..
ERROR: CTL:TIMEOUT
DEBUG: submit_common_msg: TO status ff
DEBUG: RET(ctlr) URB:[ 0] dev: 0,ep: 0-I,type:CTRL,len:0/64 stat:0x20
usb_new_device: 64 byte descr
usb_control_msg: request: 0x3, requesttype: 0x23
value 0x4 index 0x1 length 0x0
INFO: submit_control_msg
DEBUG: SUB URB:[ 0] dev: 1,ep: 0-O,type:CTRL,len:0/0 stat:0x80000000
DEBUG: SUB(rh) URB:[ 0] dev: 1,ep: 0-O,type:CTRL,len:0/0 stat:0x80000000
INFO: Root-Hub: adr: 1 cmd(8): 00000323 0004 0001 0000
INFO: WR:portstatus[0] 0x10
DEBUG: roothub.a: 02001202 POTPGT=2 NOCP NPS NDP=2
DEBUG: roothub.b: 00000000 PPCM=0000 DR=0000
DEBUG: roothub.status: 00000000
DEBUG: roothub.portstatus [0] = 0x00100103 PRSC PPS PES CCS
DEBUG: roothub.portstatus [1] = 0x00000100 PPS
DEBUG: RET(rh) URB:[ 0] dev: 1,ep: 0-O,type:CTRL,len:0/0 stat:0x0
usb_control_msg: request: 0x0, requesttype: 0xA3
value 0x0 index 0x1 length 0x4
INFO: submit_control_msg
DEBUG: SUB URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:0/4 stat:0x80000000
DEBUG: SUB(rh) URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:0/4 stat:0x80000000
INFO: Root-Hub: adr: 1 cmd(8): 000000a3 0000 0001 0004
DEBUG: roothub.a: 02001202 POTPGT=2 NOCP NPS NDP=2
DEBUG: roothub.b: 00000000 PPCM=0000 DR=0000
DEBUG: roothub.status: 00000000
DEBUG: roothub.portstatus [0] = 0x00100103 PRSC PPS PES CCS
DEBUG: roothub.portstatus [1] = 0x00000100 PPS
DEBUG: RET(rh) URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:4/4 stat:0x0
usb_control_msg: request: 0x1, requesttype: 0x23
value 0x14 index 0x1 length 0x0
INFO: submit_control_msg
DEBUG: SUB URB:[ 0] dev: 1,ep: 0-O,type:CTRL,len:0/0 stat:0x80000000
DEBUG: SUB(rh) URB:[ 0] dev: 1,ep: 0-O,type:CTRL,len:0/0 stat:0x80000000
INFO: Root-Hub: adr: 1 cmd(8): 00000123 0014 0001 0000
INFO: WR:portstatus[0] 0x100000
DEBUG: roothub.a: 02001202 POTPGT=2 NOCP NPS NDP=2
DEBUG: roothub.b: 00000000 PPCM=0000 DR=0000
DEBUG: roothub.status: 00000000
DEBUG: roothub.portstatus [0] = 0x00000103 PPS PES CCS
DEBUG: roothub.portstatus [1] = 0x00000100 PPS
DEBUG: RET(rh) URB:[ 0] dev: 1,ep: 0-O,type:CTRL,len:0/0 stat:0x0
set address 2
usb_control_msg: request: 0x5, requesttype: 0x0
value 0x2 index 0x0 length 0x0
INFO: submit_control_msg
DEBUG: SUB URB:[ 0] dev: 0,ep: 0-O,type:CTRL,len:0/0 stat:0x80000000
ERROR: submit_control_message: pipesize for pipe 80000000 is zero
USB device not accepting new address (error=80000000)
usb_control_msg: request: 0x1, requesttype: 0x23
value 0x1 index 0x1 length 0x0
INFO: submit_control_msg
DEBUG: SUB URB:[ 0] dev: 1,ep: 0-O,type:CTRL,len:0/0 stat:0x80000000
DEBUG: SUB(rh) URB:[ 0] dev: 1,ep: 0-O,type:CTRL,len:0/0 stat:0x80000000
INFO: Root-Hub: adr: 1 cmd(8): 00000123 0001 0001 0000
INFO: WR:portstatus[0] 0x1
DEBUG: roothub.a: 02001202 POTPGT=2 NOCP NPS NDP=2
DEBUG: roothub.b: 00000000 PPCM=0000 DR=0000
DEBUG: roothub.status: 00000000
DEBUG: roothub.portstatus [0] = 0x00000101 PPS CCS
DEBUG: roothub.portstatus [1] = 0x00000100 PPS
DEBUG: RET(rh) URB:[ 0] dev: 1,ep: 0-O,type:CTRL,len:0/0 stat:0x0
usb_control_msg: request: 0x0, requesttype: 0xA3
value 0x0 index 0x2 length 0x4
INFO: submit_control_msg
DEBUG: SUB URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:0/4 stat:0x80000000
DEBUG: SUB(rh) URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:0/4 stat:0x80000000
INFO: Root-Hub: adr: 1 cmd(8): 000000a3 0000 0002 0004
DEBUG: roothub.a: 02001202 POTPGT=2 NOCP NPS NDP=2
DEBUG: roothub.b: 00000000 PPCM=0000 DR=0000
DEBUG: roothub.status: 00000000
DEBUG: roothub.portstatus [0] = 0x00000101 PPS CCS
DEBUG: roothub.portstatus [1] = 0x00000100 PPS
DEBUG: RET(rh) URB:[ 0] dev: 1,ep: 0-I,type:CTRL,len:4/4 stat:0x0
2 USB Device(s) found
scanning bus for storage devices...
0 Storage Device(s) found
Thank you a lot.
Best regards
--
View this message in context: http://old.nabble.com/ERROR%3A-CTL%3ATIMEOUT---USB-porting-issue-for-UBoot-…
Sent from the Uboot - Users mailing list archive at Nabble.com.
2
1
Hi,
when i run fw_printenv , its not working..It shows:- fw_printenv: line 1:
syntax error: "(" unexpected error... Let me tell you what i did...
1) i copy the u-boot source code from my colleague and copy in my hard disk.
2) After then i set the environment through commnads. the commands which i
run are
# make CROSS_COMPILE=arm-none-linux-gnueabi- ARCH=arm distclean
# make CROSS_COMPILE=arm-none-linux-gnueabi- ARCH=arm omap3_evm_config
# make CROSS_COMPILE=arm-none-linux-gnueabi- ARCH=arm
3) After then i go to /tools/env, where i configure the fw_env.config and
then run make command.
4) After ruuning the command i got crc32.c and fw_printenv.
5)i copied the fw_printenv into the SD-Card and insert the card into the
OMAP3EVM board.
6) after then when i use the command ./fw_printenv it throws the error
fw_printenv: line 1: syntax error: "(" unexpected error..
Can u please help me what i have to do... I think i am doing
something wrong...
--
View this message in context: http://old.nabble.com/fw_printenv-is-not-working-tp29297562p29297562.html
Sent from the Uboot - Users mailing list archive at Nabble.com.
4
3
In case malloc is invoked with requested size 0, this patch will prevent
the execution of the allocation algorithm (because it corrupts the data
structures)
and will return 0 to the caller.
Signed-off-by: Nikolaos Kostaras <nkost(a)intracomdefense.com>
---
common/dlmalloc.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/common/dlmalloc.c b/common/dlmalloc.c
index fce7a76..d9e3ea9 100644
--- a/common/dlmalloc.c
+++ b/common/dlmalloc.c
@@ -2182,7 +2182,7 @@ Void_t* mALLOc(bytes) size_t bytes;
return 0;
}
- if ((long)bytes < 0) return 0;
+ if ((long)bytes <= 0) return 0;
nb = request2size(bytes); /* padded request size; */
--
1.6.4.4
9
74

16 Oct '12
If one wants to use fw_printenv/fw_setenv in special variants (eg compiled in
MTD parameters without configuration file) he needs to change the sources.
This patch add the posibillity to change the behaviour of fw_printenv by
defining a specific configuration header at compile time.
Signed-off-by: Andreas Bießmann <biessmann(a)corscience.de>
---
This patch was generated after http://patchwork.ozlabs.org/patch/112349/
without that patch auto-merge may fail.
.gitignore | 2 +
tools/env/Makefile | 12 ++++++-
tools/env/fw_env.h | 28 +++---------------
tools/env/fw_env_config.h.in | 65 ++++++++++++++++++++++++++++++++++++++++++
4 files changed, 82 insertions(+), 25 deletions(-)
create mode 100644 tools/env/fw_env_config.h.in
diff --git a/.gitignore b/.gitignore
index 34a2ca9..351397f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -46,6 +46,8 @@
/include/generated/
/lib/asm-offsets.s
+/tools/env/fw_env_config.h
+
# stgit generated dirs
patches-*
.stgit-edit.txt
diff --git a/tools/env/Makefile b/tools/env/Makefile
index 28b73da..2109c83 100644
--- a/tools/env/Makefile
+++ b/tools/env/Makefile
@@ -24,12 +24,14 @@
include $(TOPDIR)/config.mk
HOSTSRCS := $(SRCTREE)/lib/crc32.c fw_env.c fw_env_main.c
-HEADERS := fw_env.h
+HEADERS := fw_env.h $(obj)fw_env_config.h
+FW_ENV_CONFIG_IN := $(if $(FW_ENV_CONFIG),$(FW_ENV_CONFIG),fw_env_config.h.in)
# Compile for a hosted environment on the target
HOSTCPPFLAGS = -idirafter $(SRCTREE)/include \
-idirafter $(OBJTREE)/include2 \
-idirafter $(OBJTREE)/include \
+ -I $(obj) \
-DUSE_HOSTCC
ifeq ($(MTD_VERSION),old)
@@ -42,8 +44,14 @@ all: $(obj)fw_printenv
$(obj)fw_printenv: $(HOSTSRCS) $(HEADERS)
$(HOSTCC) $(HOSTCFLAGS_NOPED) $(HOSTLDFLAGS) -o $@ $(HOSTSRCS)
+$(obj)fw_env_config.h: $(FW_ENV_CONFIG_IN)
+ @cp -f $< $@
+
+# add additional dependency for .depend
+$(obj).depend: $(obj)fw_env_config.h
+
clean:
- rm -f $(obj)fw_printenv
+ rm -f $(obj)fw_printenv $(obj)fw_env_config.h
#########################################################################
diff --git a/tools/env/fw_env.h b/tools/env/fw_env.h
index 9258c79..bc67c02 100644
--- a/tools/env/fw_env.h
+++ b/tools/env/fw_env.h
@@ -20,30 +20,10 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
+#ifndef _FW_ENV_H_
+#define _FW_ENV_H_
-/*
- * To build the utility with the run-time configuration
- * uncomment the next line.
- * See included "fw_env.config" sample file
- * for notes on configuration.
- */
-#define CONFIG_FILE "/etc/fw_env.config"
-
-#define HAVE_REDUND /* For systems with 2 env sectors */
-#define DEVICE1_NAME "/dev/mtd1"
-#define DEVICE2_NAME "/dev/mtd2"
-#define DEVICE1_OFFSET 0x0000
-#define ENV1_SIZE 0x4000
-#define DEVICE2_OFFSET 0x0000
-#define ENV2_SIZE 0x4000
-
-#define CONFIG_BAUDRATE 115200
-#define CONFIG_BOOTDELAY 5 /* autoboot after 5 seconds */
-#define CONFIG_BOOTCOMMAND \
- "bootp; " \
- "setenv bootargs root=/dev/nfs nfsroot=${serverip}:${rootpath} " \
- "ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}::off; " \
- "bootm"
+#include "fw_env_config.h"
extern int fw_printenv(int argc, char *argv[]);
extern char *fw_getenv (char *name);
@@ -54,3 +34,5 @@ extern int fw_env_write(char *name, char *value);
extern int fw_env_close(void);
extern unsigned long crc32 (unsigned long, const unsigned char *, unsigned);
+
+#endif // _FW_ENV_H_
diff --git a/tools/env/fw_env_config.h.in b/tools/env/fw_env_config.h.in
new file mode 100644
index 0000000..3336af9
--- /dev/null
+++ b/tools/env/fw_env_config.h.in
@@ -0,0 +1,65 @@
+/*
+ * (C) Copyright 2002-2008
+ * Wolfgang Denk, DENX Software Engineering, wd(a)denx.de.
+ *
+ * (C) Copyright 2011
+ * Andreas Bießmann, Corscience GmbH&Co.KG, biessmann(a)corscience.de
+ *
+ * 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
+ */
+
+/*
+ * This is an example configuration for fw_printenv/fw_setenv
+ *
+ * If you like to specialize your build of fw_printenv you may copy this file,
+ * modifiy it and add FW_ENV_CONFIG define to the make call:
+ *
+ * make O=/tmp/fw_env_build env FW_ENV_CONFIG=/my/special/configuration/header
+ *
+ * If the FW_ENV_CONFIG is not defined, this file will be used
+ */
+
+#ifndef _FW_ENV_CONFIG_H_
+#define _FW_ENV_CONFIG_H_
+
+/*
+ * To build the utility with the run-time configuration
+ * uncomment the next line.
+ * See included "fw_env.config" sample file
+ * for notes on configuration.
+ */
+#define CONFIG_FILE "/etc/fw_env.config"
+
+#define HAVE_REDUND /* For systems with 2 env sectors */
+#define DEVICE1_NAME "/dev/mtd1"
+#define DEVICE2_NAME "/dev/mtd2"
+#define DEVICE1_OFFSET 0x0000
+#define ENV1_SIZE 0x4000
+#define DEVICE2_OFFSET 0x0000
+#define ENV2_SIZE 0x4000
+
+#define CONFIG_BAUDRATE 115200
+#define CONFIG_BOOTDELAY 5 /* autoboot after 5 seconds */
+#define CONFIG_BOOTCOMMAND \
+ "bootp; " \
+ "setenv bootargs root=/dev/nfs nfsroot=${serverip}:${rootpath} " \
+ "ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}::off; " \
+ "bootm"
+
+#endif // _FW_ENV_CONFIG_H_
--
1.7.5.4
5
10
Hi Stefan,
I address this question to you because one of your commits is connected to this
problem, but other hints from other readers are also welcome ;-) .
We have a kirkwood based board with a micron NAND flash. We have one ubi device
created on the NAND flash and inside the device we have one ubi volume were we
store our linux kernel. At startup we attach to the ubi device, to be able to
readout the kernel image. On our old u-boot branch which based on v2009.08 we
hadn't any problems. Now after upgrading to the newest u-boot version we saw in
some rarely cases our u-boot get stuck when we try to attach:
=> ubi part ubi0
Creating 1 MTD partitions on "nand0":
0x000000000000-0x000008000000 : "mtd=0"
UBI: attaching mtd1 to ubi0
UBI: physical eraseblock size: 131072 bytes (128 KiB)
UBI: logical eraseblock size: 129024 bytes
UBI: smallest flash I/O unit: 2048
UBI: sub-page size: 512
UBI: VID header offset: 512 (aligned 512)
UBI: data offset: 2048
UBI: fixable bit-flip detected at PEB 71
And after this u-boot gets stuck until the end of days and we have to force a
reboot, but the u-boot gets stuck again.
If I revert your commit:
commit 1b1f9a9d00447d9eab32ae5633f60a106196b75f
Author: Stefan Roese <sr(a)denx.de>
Date: Mon May 17 10:00:51 2010 +0200
UBI: Ensure that "background thread" operations are really executed
the u-boot don't get stuck:
=> ubi part ubi0
Creating 1 MTD partitions on "nand0":
0x000000000000-0x000008000000 : "mtd=0"
UBI: attaching mtd1 to ubi0
UBI: physical eraseblock size: 131072 bytes (128 KiB)
UBI: logical eraseblock size: 129024 bytes
UBI: smallest flash I/O unit: 2048
UBI: sub-page size: 512
UBI: VID header offset: 512 (aligned 512)
UBI: data offset: 2048
UBI: fixable bit-flip detected at PEB 71
UBI: attached mtd1 to ubi0
UBI: MTD device name: "mtd=0"
UBI: MTD device size: 128 MiB
UBI: number of good PEBs: 1024
UBI: number of bad PEBs: 0
UBI: max. allowed volumes: 128
UBI: wear-leveling threshold: 4096
UBI: number of internal volumes: 1
UBI: number of user volumes: 9
UBI: available PEBs: 623
UBI: total number of reserved PEBs: 401
UBI: number of PEBs reserved for bad PEB handling: 10
UBI: max/mean erase counter: 8193/3082
=>
This is the reason why our old u-boot works, because the background thread seems
to be not or not completely executed...
If I boot a recent linux kernel the kernel also reports an "fixable bit-flip
detected at PEB 71" but linux is able to really fix this bit flip and is able to
work as expceted, even u-boot is afterwards bootable because the bitflip is
corrected and gone.
Now I could revert your commit in my local branch and then it seems to work, but
I think this is not a good solution because I expect that the real error is
somewhere in the UBI layer in u-boot and already fixed in current linux. AFAIK
the ubi layer was initially copied from linux, but it seems that the bugfixes
are not backported in the last years. Any thoughts or ideas?
Best regards
Holger
3
10
From: Uma Shankar <uma.shankar(a)samsung.com>
Signed-off-by: Uma Shankar <uma.shankar(a)samsung.com>
Signed-off-by: Manjunatha C Achar <a.manjunatha(a)samsung.com>
Signed-off-by: Iqbal Shareef <iqbal.ams(a)samsung.com>
Signed-off-by: Hakgoo Lee <goodguy.lee(a)samsung.com>
---
Makefile | 2 +-
common/Makefile | 1 +
common/cmd_ext2.c | 1 +
common/cmd_ext4.c | 253 ++++++++++++++++++++++
fs/Makefile | 1 +
fs/ext2/dev.c | 1 +
fs/ext2/ext2fs.c | 340 +++---------------------------
fs/ext4/Makefile | 51 +++++
fs/ext4/ext4_common.c | 573 +++++++++++++++++++++++++++++++++++++++++++++++++
fs/ext4/ext4_common.h | 44 ++++
fs/ext4/ext4fs.c | 215 ++++++++++++++++++
include/ext2fs.h | 16 +-
include/ext4fs.h | 116 ++++++++++
include/ext_common.h | 199 +++++++++++++++++
14 files changed, 1489 insertions(+), 324 deletions(-)
create mode 100644 common/cmd_ext4.c
create mode 100644 fs/ext4/Makefile
create mode 100644 fs/ext4/ext4_common.c
create mode 100644 fs/ext4/ext4_common.h
create mode 100644 fs/ext4/ext4fs.c
create mode 100644 include/ext4fs.h
create mode 100644 include/ext_common.h
diff --git a/Makefile b/Makefile
index 5de7915..20cb941 100644
--- a/Makefile
+++ b/Makefile
@@ -235,7 +235,7 @@ LIBS += dts/libdts.o
endif
LIBS += arch/$(ARCH)/lib/lib$(ARCH).o
LIBS += fs/cramfs/libcramfs.o fs/fat/libfat.o fs/fdos/libfdos.o fs/jffs2/libjffs2.o \
- fs/reiserfs/libreiserfs.o fs/ext2/libext2fs.o fs/yaffs2/libyaffs2.o \
+ fs/reiserfs/libreiserfs.o fs/ext2/libext2fs.o fs/ext4/libext4fs.o fs/yaffs2/libyaffs2.o \
fs/ubifs/libubifs.o
LIBS += net/libnet.o
LIBS += disk/libdisk.o
diff --git a/common/Makefile b/common/Makefile
index 2d9ae8c..d99cc31 100644
--- a/common/Makefile
+++ b/common/Makefile
@@ -87,6 +87,7 @@ COBJS-$(CONFIG_CMD_EEPROM) += cmd_eeprom.o
COBJS-$(CONFIG_CMD_ELF) += cmd_elf.o
COBJS-$(CONFIG_SYS_HUSH_PARSER) += cmd_exit.o
COBJS-$(CONFIG_CMD_EXT2) += cmd_ext2.o
+COBJS-$(CONFIG_CMD_EXT4) += cmd_ext4.o
COBJS-$(CONFIG_CMD_FAT) += cmd_fat.o
COBJS-$(CONFIG_CMD_FDC)$(CONFIG_CMD_FDOS) += cmd_fdc.o
COBJS-$(CONFIG_OF_LIBFDT) += cmd_fdt.o fdt_support.o
diff --git a/common/cmd_ext2.c b/common/cmd_ext2.c
index 35fb361..3ccc47e 100644
--- a/common/cmd_ext2.c
+++ b/common/cmd_ext2.c
@@ -40,6 +40,7 @@
#include <linux/ctype.h>
#include <asm/byteorder.h>
#include <ext2fs.h>
+#include <ext_common.h>
#if defined(CONFIG_CMD_USB) && defined(CONFIG_USB_STORAGE)
#include <usb.h>
#endif
diff --git a/common/cmd_ext4.c b/common/cmd_ext4.c
new file mode 100644
index 0000000..7c2d541
--- /dev/null
+++ b/common/cmd_ext4.c
@@ -0,0 +1,253 @@
+/*
+ * (C) Copyright 2011 Samsung Electronics
+ * EXT4 filesystem implementation in Uboot by
+ * Uma Shankar <uma.shankar(a)samsung.com>
+ * Manjunatha C Achar <a.manjunatha(a)samsung.com>
+ *
+ * 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
+ *
+ */
+
+/*
+ * Ext4fs support
+ * made from existing cmd_ext2.c file of Uboot
+ */
+#include <common.h>
+#include <part.h>
+#include <config.h>
+#include <command.h>
+#include <image.h>
+#include <linux/ctype.h>
+#include <asm/byteorder.h>
+#include <ext_common.h>
+#include <ext4fs.h>
+#include <linux/stat.h>
+#include <malloc.h>
+
+#if defined(CONFIG_CMD_USB) && defined(CONFIG_USB_STORAGE)
+#include <usb.h>
+#endif
+
+#if !defined(CONFIG_DOS_PARTITION) && !defined(CONFIG_EFI_PARTITION)
+#error DOS or EFI partition support must be selected
+#endif
+
+uint64_t total_sector;
+uint64_t part_offset;
+
+#define DOS_PART_MAGIC_OFFSET 0x1fe
+#define DOS_FS_TYPE_OFFSET 0x36
+#define DOS_FS32_TYPE_OFFSET 0x52
+
+int do_ext4_load(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
+{
+ char *filename = NULL;
+ char *ep;
+ int dev;
+ unsigned long part = 1;
+ ulong addr = 0, part_length;
+ int filelen;
+ disk_partition_t info;
+ struct ext_filesystem *fs;
+ char buf[12];
+ unsigned long count;
+ const char *addr_str;
+
+ switch (argc) {
+ case 3:
+ addr_str = getenv("loadaddr");
+ if (addr_str != NULL)
+ strict_strtoul(addr_str, 16, &addr);
+ else
+ addr = CONFIG_SYS_LOAD_ADDR;
+
+ filename = getenv("bootfile");
+ count = 0;
+ break;
+ case 4:
+ strict_strtoul(argv[3], 16, &addr);
+ filename = getenv("bootfile");
+ count = 0;
+ break;
+ case 5:
+ strict_strtoul(argv[3], 16, &addr);
+ filename = argv[4];
+ count = 0;
+ break;
+ case 6:
+ strict_strtoul(argv[3], 16, &addr);
+ filename = argv[4];
+ strict_strtoul(argv[5], 16, &count);
+ break;
+
+ default:
+ return cmd_usage(cmdtp);
+ }
+
+ if (!filename) {
+ puts("** No boot file defined **\n");
+ return 1;
+ }
+
+ dev = (int)simple_strtoul(argv[2], &ep, 16);
+ ext4_dev_desc = get_dev(argv[1], dev);
+ if (ext4_dev_desc == NULL) {
+ printf("** Block device %s %d not supported\n", argv[1], dev);
+ return 1;
+ }
+ if (init_fs(ext4_dev_desc))
+ return 1;
+
+ fs = get_fs();
+ if (*ep) {
+ if (*ep != ':') {
+ puts("** Invalid boot device, use `dev[:part]' **\n");
+ return 1;
+ }
+ (int)strict_strtoul(++ep, 16, &part);
+ }
+
+ if (part != 0) {
+ if (get_partition_info(fs->dev_desc, part, &info)) {
+ printf("** Bad partition %lu **\n", part);
+ return 1;
+ }
+
+ if (strncmp((char *)info.type, BOOT_PART_TYPE,
+ sizeof(info.type)) != 0) {
+ printf("** Invalid partition type \"%.32s\""
+ " (expect \"" BOOT_PART_TYPE "\")\n", info.type);
+ return 1;
+ }
+ printf("Loading file \"%s\" "
+ "from %s device %d:%lu (%.32s)\n",
+ filename, argv[1], dev, part, info.name);
+ } else {
+ printf("Loading file \"%s\" from %s device %d\n",
+ filename, argv[1], dev);
+ }
+
+ part_length = ext2fs_set_blk_dev(fs->dev_desc, part);
+ if (part_length == 0) {
+ printf("**Bad partition - %s %d:%lu **\n", argv[1], dev, part);
+ ext4fs_close();
+ return 1;
+ }
+
+ if (!ext4fs_mount(part_length)) {
+ printf("** Bad ext2 partition or disk - %s %d:%lu **\n",
+ argv[1], dev, part);
+ ext4fs_close();
+ return 1;
+ }
+
+ filelen = ext4fs_open(filename);
+ if (filelen < 0) {
+ printf("** File not found %s\n", filename);
+ ext4fs_close();
+ return 1;
+ }
+ if ((count < filelen) && (count != 0))
+ filelen = count;
+
+ if (ext4fs_read((char *)addr, filelen) != filelen) {
+ printf("** Unable to read \"%s\" from %s %d:%lu **\n",
+ filename, argv[1], dev, part);
+ ext4fs_close();
+ return 1;
+ }
+
+ ext4fs_close();
+ deinit_fs(fs->dev_desc);
+ /* Loading ok, update default load address */
+ load_addr = addr;
+
+ printf("%d bytes read\n", filelen);
+ sprintf(buf, "%X", filelen);
+ setenv("filesize", buf);
+
+ return 0;
+}
+
+int do_ext4_ls(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
+{
+ char *filename = "/";
+ int dev = 0;
+ unsigned long part = 1;
+ char *ep;
+ struct ext_filesystem *fs;
+ int part_length;
+
+ if (argc < 3)
+ return cmd_usage(cmdtp);
+
+ dev = (int)simple_strtoul(argv[2], &ep, 16);
+ ext4_dev_desc = get_dev(argv[1], dev);
+
+ if (ext4_dev_desc == NULL) {
+ printf("\n** Block device %s %d not supported\n", argv[1], dev);
+ return 1;
+ }
+
+ if (init_fs(ext4_dev_desc))
+ return 1;
+
+ fs = get_fs();
+ if (*ep) {
+ if (*ep != ':') {
+ puts("\n** Invalid boot device, use `dev[:part]' **\n");
+ return 1;
+ }
+ (int)strict_strtoul(++ep, 16, &part);
+ }
+
+ if (argc == 4)
+ filename = argv[3];
+
+ part_length = ext2fs_set_blk_dev(fs->dev_desc, part);
+ if (part_length == 0) {
+ printf("** Bad partition - %s %d:%lu **\n", argv[1], dev, part);
+ ext4fs_close();
+ return 1;
+ }
+
+ if (!ext4fs_mount(part_length)) {
+ printf("** Bad ext2 partition or disk - %s %d:%lu **\n",
+ argv[1], dev, part);
+ ext4fs_close();
+ return 1;
+ }
+ if (ext4fs_ls(filename)) {
+ printf("** Error ext2fs_ls() **\n");
+ ext4fs_close();
+ return 1;
+ };
+
+ ext4fs_close();
+ deinit_fs(fs->dev_desc);
+ return 0;
+}
+
+U_BOOT_CMD(ext4ls, 4, 1, do_ext4_ls,
+ "list files in a directory (default /)",
+ "<interface> <dev[:part]> [directory]\n"
+ " - list files from 'dev' on 'interface' in a 'directory'");
+
+U_BOOT_CMD(ext4load, 6, 0, do_ext4_load,
+ "load binary file from a Ext2 filesystem",
+ "<interface> <dev[:part]> [addr] [filename] [bytes]\n"
+ " - load binary file 'filename' from 'dev' on 'interface'\n"
+ " to address 'addr' from ext2 filesystem");
diff --git a/fs/Makefile b/fs/Makefile
index 22aad12..27330d4 100644
--- a/fs/Makefile
+++ b/fs/Makefile
@@ -24,6 +24,7 @@
subdirs-$(CONFIG_CMD_CRAMFS) := cramfs
subdirs-$(CONFIG_CMD_EXT2) += ext2
+subdirs-$(CONFIG_CMD_EXT4) += ext4
subdirs-$(CONFIG_CMD_FAT) += fat
subdirs-$(CONFIG_CMD_FDOS) += fdos
subdirs-$(CONFIG_CMD_JFFS2) += jffs2
diff --git a/fs/ext2/dev.c b/fs/ext2/dev.c
index 874e211..315ff53 100644
--- a/fs/ext2/dev.c
+++ b/fs/ext2/dev.c
@@ -27,6 +27,7 @@
#include <common.h>
#include <config.h>
#include <ext2fs.h>
+#include <ext_common.h>
static block_dev_desc_t *ext2fs_block_dev_desc;
static disk_partition_t part_info;
diff --git a/fs/ext2/ext2fs.c b/fs/ext2/ext2fs.c
index e119e13..df336b9 100644
--- a/fs/ext2/ext2fs.c
+++ b/fs/ext2/ext2fs.c
@@ -25,152 +25,12 @@
#include <common.h>
#include <ext2fs.h>
+#include <ext_common.h>
#include <malloc.h>
#include <asm/byteorder.h>
-extern int ext2fs_devread (int sector, int byte_offset, int byte_len,
- char *buf);
-
-/* Magic value used to identify an ext2 filesystem. */
-#define EXT2_MAGIC 0xEF53
-/* Amount of indirect blocks in an inode. */
-#define INDIRECT_BLOCKS 12
-/* Maximum lenght of a pathname. */
-#define EXT2_PATH_MAX 4096
-/* Maximum nesting of symlinks, used to prevent a loop. */
-#define EXT2_MAX_SYMLINKCNT 8
-
-/* Filetype used in directory entry. */
-#define FILETYPE_UNKNOWN 0
-#define FILETYPE_REG 1
-#define FILETYPE_DIRECTORY 2
-#define FILETYPE_SYMLINK 7
-
-/* Filetype information as used in inodes. */
-#define FILETYPE_INO_MASK 0170000
-#define FILETYPE_INO_REG 0100000
-#define FILETYPE_INO_DIRECTORY 0040000
-#define FILETYPE_INO_SYMLINK 0120000
-
-/* Bits used as offset in sector */
-#define DISK_SECTOR_BITS 9
-
-/* Log2 size of ext2 block in 512 blocks. */
-#define LOG2_EXT2_BLOCK_SIZE(data) (__le32_to_cpu (data->sblock.log2_block_size) + 1)
-
-/* Log2 size of ext2 block in bytes. */
-#define LOG2_BLOCK_SIZE(data) (__le32_to_cpu (data->sblock.log2_block_size) + 10)
-
-/* The size of an ext2 block in bytes. */
-#define EXT2_BLOCK_SIZE(data) (1 << LOG2_BLOCK_SIZE(data))
-
-/* The ext2 superblock. */
-struct ext2_sblock {
- uint32_t total_inodes;
- uint32_t total_blocks;
- uint32_t reserved_blocks;
- uint32_t free_blocks;
- uint32_t free_inodes;
- uint32_t first_data_block;
- uint32_t log2_block_size;
- uint32_t log2_fragment_size;
- uint32_t blocks_per_group;
- uint32_t fragments_per_group;
- uint32_t inodes_per_group;
- uint32_t mtime;
- uint32_t utime;
- uint16_t mnt_count;
- uint16_t max_mnt_count;
- uint16_t magic;
- uint16_t fs_state;
- uint16_t error_handling;
- uint16_t minor_revision_level;
- uint32_t lastcheck;
- uint32_t checkinterval;
- uint32_t creator_os;
- uint32_t revision_level;
- uint16_t uid_reserved;
- uint16_t gid_reserved;
- uint32_t first_inode;
- uint16_t inode_size;
- uint16_t block_group_number;
- uint32_t feature_compatibility;
- uint32_t feature_incompat;
- uint32_t feature_ro_compat;
- uint32_t unique_id[4];
- char volume_name[16];
- char last_mounted_on[64];
- uint32_t compression_info;
-};
-
-/* The ext2 blockgroup. */
-struct ext2_block_group {
- uint32_t block_id;
- uint32_t inode_id;
- uint32_t inode_table_id;
- uint16_t free_blocks;
- uint16_t free_inodes;
- uint16_t used_dir_cnt;
- uint32_t reserved[3];
-};
-
-/* The ext2 inode. */
-struct ext2_inode {
- uint16_t mode;
- uint16_t uid;
- uint32_t size;
- uint32_t atime;
- uint32_t ctime;
- uint32_t mtime;
- uint32_t dtime;
- uint16_t gid;
- uint16_t nlinks;
- uint32_t blockcnt; /* Blocks of 512 bytes!! */
- uint32_t flags;
- uint32_t osd1;
- union {
- struct datablocks {
- uint32_t dir_blocks[INDIRECT_BLOCKS];
- uint32_t indir_block;
- uint32_t double_indir_block;
- uint32_t tripple_indir_block;
- } blocks;
- char symlink[60];
- } b;
- uint32_t version;
- uint32_t acl;
- uint32_t dir_acl;
- uint32_t fragment_addr;
- uint32_t osd2[3];
-};
-
-/* The header of an ext2 directory entry. */
-struct ext2_dirent {
- uint32_t inode;
- uint16_t direntlen;
- uint8_t namelen;
- uint8_t filetype;
-};
-
-struct ext2fs_node {
- struct ext2_data *data;
- struct ext2_inode inode;
- int ino;
- int inode_read;
-};
-
-/* Information about a "mounted" ext2 filesystem. */
-struct ext2_data {
- struct ext2_sblock sblock;
- struct ext2_inode *inode;
- struct ext2fs_node diropen;
-};
-
-
-typedef struct ext2fs_node *ext2fs_node_t;
-
-struct ext2_data *ext2fs_root = NULL;
-ext2fs_node_t ext2fs_file = NULL;
+struct ext2_data *ext2fs_root;
+struct ext2fs_node *ext2fs_file;
int symlinknest = 0;
uint32_t *indir1_block = NULL;
int indir1_size = 0;
@@ -178,8 +38,7 @@ int indir1_blkno = -1;
uint32_t *indir2_block = NULL;
int indir2_size = 0;
int indir2_blkno = -1;
-static unsigned int inode_size;
-
+unsigned int inode_size;
static int ext2fs_blockgroup
(struct ext2_data *data, int group, struct ext2_block_group *blkgrp) {
@@ -198,10 +57,8 @@ static int ext2fs_blockgroup
#endif
return (ext2fs_devread (blkno << LOG2_EXT2_BLOCK_SIZE(data),
blkoff, sizeof(struct ext2_block_group), (char *)blkgrp));
-
}
-
static int ext2fs_read_inode
(struct ext2_data *data, int ino, struct ext2_inode *inode) {
struct ext2_block_group blkgrp;
@@ -242,155 +99,16 @@ static int ext2fs_read_inode
return (1);
}
-
-void ext2fs_free_node (ext2fs_node_t node, ext2fs_node_t currroot) {
+void ext2fs_free_node(struct ext2fs_node *node, struct ext2fs_node *currroot)
+{
if ((node != &ext2fs_root->diropen) && (node != currroot)) {
free (node);
}
}
-
-static int ext2fs_read_block (ext2fs_node_t node, int fileblock) {
- struct ext2_data *data = node->data;
- struct ext2_inode *inode = &node->inode;
- int blknr;
- int blksz = EXT2_BLOCK_SIZE (data);
- int log2_blksz = LOG2_EXT2_BLOCK_SIZE (data);
- int status;
-
- /* Direct blocks. */
- if (fileblock < INDIRECT_BLOCKS) {
- blknr = __le32_to_cpu (inode->b.blocks.dir_blocks[fileblock]);
- }
- /* Indirect. */
- else if (fileblock < (INDIRECT_BLOCKS + (blksz / 4))) {
- if (indir1_block == NULL) {
- indir1_block = (uint32_t *) malloc (blksz);
- if (indir1_block == NULL) {
- printf ("** ext2fs read block (indir 1) malloc failed. **\n");
- return (-1);
- }
- indir1_size = blksz;
- indir1_blkno = -1;
- }
- if (blksz != indir1_size) {
- free (indir1_block);
- indir1_block = NULL;
- indir1_size = 0;
- indir1_blkno = -1;
- indir1_block = (uint32_t *) malloc (blksz);
- if (indir1_block == NULL) {
- printf ("** ext2fs read block (indir 1) malloc failed. **\n");
- return (-1);
- }
- indir1_size = blksz;
- }
- if ((__le32_to_cpu (inode->b.blocks.indir_block) <<
- log2_blksz) != indir1_blkno) {
- status = ext2fs_devread (__le32_to_cpu(inode->b.blocks.indir_block) << log2_blksz,
- 0, blksz,
- (char *) indir1_block);
- if (status == 0) {
- printf ("** ext2fs read block (indir 1) failed. **\n");
- return (0);
- }
- indir1_blkno =
- __le32_to_cpu (inode->b.blocks.
- indir_block) << log2_blksz;
- }
- blknr = __le32_to_cpu (indir1_block
- [fileblock - INDIRECT_BLOCKS]);
- }
- /* Double indirect. */
- else if (fileblock <
- (INDIRECT_BLOCKS + (blksz / 4 * (blksz / 4 + 1)))) {
- unsigned int perblock = blksz / 4;
- unsigned int rblock = fileblock - (INDIRECT_BLOCKS
- + blksz / 4);
-
- if (indir1_block == NULL) {
- indir1_block = (uint32_t *) malloc (blksz);
- if (indir1_block == NULL) {
- printf ("** ext2fs read block (indir 2 1) malloc failed. **\n");
- return (-1);
- }
- indir1_size = blksz;
- indir1_blkno = -1;
- }
- if (blksz != indir1_size) {
- free (indir1_block);
- indir1_block = NULL;
- indir1_size = 0;
- indir1_blkno = -1;
- indir1_block = (uint32_t *) malloc (blksz);
- if (indir1_block == NULL) {
- printf ("** ext2fs read block (indir 2 1) malloc failed. **\n");
- return (-1);
- }
- indir1_size = blksz;
- }
- if ((__le32_to_cpu (inode->b.blocks.double_indir_block) <<
- log2_blksz) != indir1_blkno) {
- status = ext2fs_devread (__le32_to_cpu(inode->b.blocks.double_indir_block) << log2_blksz,
- 0, blksz,
- (char *) indir1_block);
- if (status == 0) {
- printf ("** ext2fs read block (indir 2 1) failed. **\n");
- return (-1);
- }
- indir1_blkno =
- __le32_to_cpu (inode->b.blocks.double_indir_block) << log2_blksz;
- }
-
- if (indir2_block == NULL) {
- indir2_block = (uint32_t *) malloc (blksz);
- if (indir2_block == NULL) {
- printf ("** ext2fs read block (indir 2 2) malloc failed. **\n");
- return (-1);
- }
- indir2_size = blksz;
- indir2_blkno = -1;
- }
- if (blksz != indir2_size) {
- free (indir2_block);
- indir2_block = NULL;
- indir2_size = 0;
- indir2_blkno = -1;
- indir2_block = (uint32_t *) malloc (blksz);
- if (indir2_block == NULL) {
- printf ("** ext2fs read block (indir 2 2) malloc failed. **\n");
- return (-1);
- }
- indir2_size = blksz;
- }
- if ((__le32_to_cpu (indir1_block[rblock / perblock]) <<
- log2_blksz) != indir2_blkno) {
- status = ext2fs_devread (__le32_to_cpu(indir1_block[rblock / perblock]) << log2_blksz,
- 0, blksz,
- (char *) indir2_block);
- if (status == 0) {
- printf ("** ext2fs read block (indir 2 2) failed. **\n");
- return (-1);
- }
- indir2_blkno =
- __le32_to_cpu (indir1_block[rblock / perblock]) << log2_blksz;
- }
- blknr = __le32_to_cpu (indir2_block[rblock % perblock]);
- }
- /* Tripple indirect. */
- else {
- printf ("** ext2fs doesn't support tripple indirect blocks. **\n");
- return (-1);
- }
-#ifdef DEBUG
- printf ("ext2fs_read_block %08x\n", blknr);
-#endif
- return (blknr);
-}
-
-
int ext2fs_read_file
- (ext2fs_node_t node, int pos, unsigned int len, char *buf) {
+ (struct ext2fs_node *node, int pos, unsigned int len, char *buf)
+{
int i;
int blockcnt;
int log2blocksize = LOG2_EXT2_BLOCK_SIZE (node->data);
@@ -409,8 +127,7 @@ int ext2fs_read_file
int blockend = blocksize;
int skipfirst = 0;
-
- blknr = ext2fs_read_block (node, i);
+ blknr = read_allocated_block(&(node->inode), i);
if (blknr < 0) {
return (-1);
}
@@ -449,8 +166,8 @@ int ext2fs_read_file
return (len);
}
-
-static int ext2fs_iterate_dir (ext2fs_node_t dir, char *name, ext2fs_node_t * fnode, int *ftype)
+int ext2fs_iterate_dir(struct ext2fs_node *dir, char *name,
+ struct ext2fs_node **fnode, int *ftype)
{
unsigned int fpos = 0;
int status;
@@ -479,7 +196,7 @@ static int ext2fs_iterate_dir (ext2fs_node_t dir, char *name, ext2fs_node_t * fn
}
if (dirent.namelen != 0) {
char filename[dirent.namelen + 1];
- ext2fs_node_t fdiro;
+ struct ext2fs_node *fdiro;
int type = FILETYPE_UNKNOWN;
status = ext2fs_read_file (diro,
@@ -581,8 +298,8 @@ static int ext2fs_iterate_dir (ext2fs_node_t dir, char *name, ext2fs_node_t * fn
return (0);
}
-
-static char *ext2fs_read_symlink (ext2fs_node_t node) {
+static char *ext2fs_read_symlink(struct ext2fs_node *node)
+{
char *symlink;
struct ext2fs_node *diro = node;
int status;
@@ -617,17 +334,17 @@ static char *ext2fs_read_symlink (ext2fs_node_t node) {
return (symlink);
}
-
int ext2fs_find_file1
- (const char *currpath,
- ext2fs_node_t currroot, ext2fs_node_t * currfound, int *foundtype) {
+ (const char *currpath, struct ext2fs_node *currroot,
+ struct ext2fs_node **currfound, int *foundtype)
+{
char fpath[strlen (currpath) + 1];
char *name = fpath;
char *next;
int status;
int type = FILETYPE_DIRECTORY;
- ext2fs_node_t currnode = currroot;
- ext2fs_node_t oldnode = currroot;
+ struct ext2fs_node *currnode = currroot;
+ struct ext2fs_node *oldnode = currroot;
strncpy (fpath, currpath, strlen (currpath) + 1);
@@ -721,14 +438,13 @@ int ext2fs_find_file1
return (-1);
}
-
int ext2fs_find_file
- (const char *path,
- ext2fs_node_t rootnode, ext2fs_node_t * foundnode, int expecttype) {
+ (const char *path, struct ext2fs_node *rootnode,
+ struct ext2fs_node **foundnode, int expecttype)
+{
int status;
int foundtype = FILETYPE_DIRECTORY;
-
symlinknest = 0;
if (!path) {
return (0);
@@ -748,9 +464,8 @@ int ext2fs_find_file
return (1);
}
-
int ext2fs_ls (const char *dirname) {
- ext2fs_node_t dirnode;
+ struct ext2fs_node *dirnode;
int status;
if (ext2fs_root == NULL) {
@@ -768,9 +483,8 @@ int ext2fs_ls (const char *dirname) {
return (0);
}
-
int ext2fs_open (const char *filename) {
- ext2fs_node_t fdiro = NULL;
+ struct ext2fs_node *fdiro = NULL;
int status;
int len;
@@ -799,7 +513,6 @@ fail:
return (-1);
}
-
int ext2fs_close (void
) {
if ((ext2fs_file != NULL) && (ext2fs_root != NULL)) {
@@ -825,7 +538,6 @@ int ext2fs_close (void
return (0);
}
-
int ext2fs_read (char *buf, unsigned len) {
int status;
@@ -836,12 +548,10 @@ int ext2fs_read (char *buf, unsigned len) {
if (ext2fs_file == NULL) {
return (0);
}
-
status = ext2fs_read_file (ext2fs_file, 0, len, buf);
return (status);
}
-
int ext2fs_mount (unsigned part_length) {
struct ext2_data *data;
int status;
@@ -880,7 +590,7 @@ int ext2fs_mount (unsigned part_length) {
}
ext2fs_root = data;
-
+ ext4fs_root = data;
return (1);
fail:
diff --git a/fs/ext4/Makefile b/fs/ext4/Makefile
new file mode 100644
index 0000000..850f821
--- /dev/null
+++ b/fs/ext4/Makefile
@@ -0,0 +1,51 @@
+#
+# (C) Copyright 2006
+# Wolfgang Denk, DENX Software Engineering, wd(a)denx.de.
+#
+# (C) Copyright 2003
+# Pavel Bartusek, Sysgo Real-Time Solutions AG, pba(a)sysgo.de
+#
+#
+# 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 $(TOPDIR)/config.mk
+
+LIB = $(obj)libext4fs.o
+
+AOBJS =
+COBJS-$(CONFIG_CMD_EXT4) := ext4fs.o ext4_common.o
+
+SRCS := $(AOBJS:.o=.S) $(COBJS-y:.o=.c)
+OBJS := $(addprefix $(obj),$(AOBJS) $(COBJS-y))
+
+
+all: $(LIB) $(AOBJS)
+
+$(LIB): $(obj).depend $(OBJS)
+ $(call cmd_link_o_target, $(OBJS))
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/fs/ext4/ext4_common.c b/fs/ext4/ext4_common.c
new file mode 100644
index 0000000..6f9351c
--- /dev/null
+++ b/fs/ext4/ext4_common.c
@@ -0,0 +1,573 @@
+/*
+ * (C) Copyright 2011 Samsung Electronics
+ * EXT4 filesystem implementation in Uboot by
+ * Uma Shankar <uma.shankar(a)samsung.com>
+ * Manjunatha C Achar <a.manjunatha(a)samsung.com>
+ *
+ * Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/*
+ * ext4load - based on code from GRUB2 fs/ext2.c
+*/
+#include <common.h>
+#include <ext_common.h>
+#include <ext4fs.h>
+#include <malloc.h>
+#include <asm/byteorder.h>
+#include <linux/stat.h>
+#include <linux/time.h>
+#include "ext4_common.h"
+
+struct ext2_data *ext4fs_root;
+struct ext2fs_node *ext4fs_file;
+uint32_t *ext4fs_indir1_block;
+int ext4fs_indir1_size;
+int ext4fs_indir1_blkno = -1;
+uint32_t *ext4fs_indir2_block;
+int ext4fs_indir2_size;
+int ext4fs_indir2_blkno = -1;
+
+uint32_t *ext4fs_indir3_block;
+int ext4fs_indir3_size;
+int ext4fs_indir3_blkno = -1;
+struct ext2_inode *g_parent_inode;
+
+#ifndef offsetof
+#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
+#endif
+
+void *xmalloc(size_t size)
+{
+ void *ptr = malloc(size);
+ if (ptr == NULL && size != 0)
+ printf("bb_msg_memory_exhausted\n");
+ return ptr;
+}
+
+void *xzalloc(size_t size)
+{
+ void *ptr = xmalloc(size);
+ memset(ptr, 0, size);
+ return ptr;
+}
+
+static struct ext4_extent_header *ext4fs_find_leaf(struct ext2_data *data,
+ char *buf, struct ext4_extent_header *ext_block, uint32_t fileblock)
+{
+ struct ext4_extent_idx *index;
+ unsigned long long block;
+ int i;
+
+ while (1) {
+ index = (struct ext4_extent_idx *)(ext_block + 1);
+
+ if (le32_to_cpu(ext_block->magic) != EXT4_EXT_MAGIC)
+ return 0;
+
+ if (ext_block->depth == 0)
+ return ext_block;
+
+ for (i = 0; i < le32_to_cpu(ext_block->entries); i++) {
+ if (fileblock < le32_to_cpu(index[i].block))
+ break;
+ }
+
+ if (--i < 0)
+ return 0;
+
+ block = le32_to_cpu(index[i].leaf_hi);
+ block = (block << 32) + le32_to_cpu(index[i].leaf);
+
+ if (ext2fs_devread(block << LOG2_EXT2_BLOCK_SIZE(data),
+ 0, EXT2_BLOCK_SIZE(data), buf)) {
+ ext_block = (struct ext4_extent_header *)buf;
+ return ext_block;
+ } else
+ return 0;
+ }
+}
+
+static int ext4fs_blockgroup
+ (struct ext2_data *data, int group, struct ext2_block_group *blkgrp)
+{
+ long int blkno;
+ unsigned int blkoff, desc_per_blk;
+
+ desc_per_blk = EXT2_BLOCK_SIZE(data) / sizeof(struct ext2_block_group);
+
+ blkno = __le32_to_cpu(data->sblock.first_data_block) + 1
+ + group / desc_per_blk;
+ blkoff = (group % desc_per_blk) * sizeof(struct ext2_block_group);
+
+ debug("ext4fs read %d group descriptor (blkno %ld blkoff %u)\n",
+ group, blkno, blkoff);
+
+ return ext2fs_devread(blkno << LOG2_EXT2_BLOCK_SIZE(data),
+ blkoff, sizeof(struct ext2_block_group), (char *)blkgrp);
+}
+
+int ext4fs_read_inode(struct ext2_data *data, int ino, struct ext2_inode *inode)
+{
+ struct ext2_block_group blkgrp;
+ struct ext2_sblock *sblock = &data->sblock;
+ struct ext_filesystem *fs = get_fs();
+ int inodes_per_block, status;
+ long int blkno;
+ unsigned int blkoff;
+
+ /* It is easier to calculate if the first inode is 0. */
+ ino--;
+ status = ext4fs_blockgroup(data, ino / __le32_to_cpu
+ (sblock->inodes_per_group), &blkgrp);
+
+ if (status == 0)
+ return 0;
+
+ inodes_per_block = EXT2_BLOCK_SIZE(data) / fs->inodesz;
+
+ blkno = __le32_to_cpu(blkgrp.inode_table_id) +
+ (ino % __le32_to_cpu(sblock->inodes_per_group))
+ / inodes_per_block;
+ blkoff = (ino % inodes_per_block) * fs->inodesz;
+ /* Read the inode. */
+ status = ext2fs_devread(blkno << LOG2_EXT2_BLOCK_SIZE(data), blkoff,
+ sizeof(struct ext2_inode), (char *)inode);
+ if (status == 0)
+ return 0;
+
+ return 1;
+}
+
+long int read_allocated_block(struct ext2_inode *inode, int fileblock)
+{
+ long int blknr;
+ int blksz;
+ int log2_blksz;
+ int status;
+ long int rblock;
+ long int perblock_parent;
+ long int perblock_child;
+ unsigned long long start;
+ /*get the blocksize of the filesystem */
+ blksz = EXT2_BLOCK_SIZE(ext4fs_root);
+ log2_blksz = LOG2_EXT2_BLOCK_SIZE(ext4fs_root);
+
+ if (le32_to_cpu(inode->flags) & EXT4_EXTENTS_FLAG) {
+ char buf[EXT2_BLOCK_SIZE(ext4fs_root)];
+ struct ext4_extent_header *leaf;
+ struct ext4_extent *ext;
+ int i;
+
+ leaf = ext4fs_find_leaf(ext4fs_root, buf,
+ (struct ext4_extent_header *)inode->
+ b.blocks.dir_blocks, fileblock);
+ if (!leaf) {
+ printf("invalid extent\n");
+ return -1;
+ }
+
+ ext = (struct ext4_extent *)(leaf + 1);
+
+ for (i = 0; i < le32_to_cpu(leaf->entries); i++) {
+ if (fileblock < le32_to_cpu(ext[i].block))
+ break;
+ }
+
+ if (--i >= 0) {
+ fileblock -= le32_to_cpu(ext[i].block);
+ if (fileblock >= le32_to_cpu(ext[i].len)) {
+ return 0;
+ } else {
+ start = le32_to_cpu(ext[i].start_hi);
+ start = (start << 32) +
+ le32_to_cpu(ext[i].start);
+ return fileblock + start;
+ }
+ } else {
+ printf("something wrong with extent\n");
+ return -1;
+ }
+ }
+
+ /* Direct blocks. */
+ if (fileblock < INDIRECT_BLOCKS)
+ blknr = __le32_to_cpu(inode->b.blocks.dir_blocks[fileblock]);
+
+ /* Indirect. */
+ else if (fileblock < (INDIRECT_BLOCKS + (blksz / 4))) {
+ if (ext4fs_indir1_block == NULL) {
+ ext4fs_indir1_block = (uint32_t *) malloc(blksz);
+ if (ext4fs_indir1_block == NULL) {
+ printf("** SI ext2fs read block (indir 1)"
+ "malloc failed. **\n");
+ return -1;
+ }
+ ext4fs_indir1_size = blksz;
+ ext4fs_indir1_blkno = -1;
+ }
+ if (blksz != ext4fs_indir1_size) {
+ free(ext4fs_indir1_block);
+ ext4fs_indir1_block = NULL;
+ ext4fs_indir1_size = 0;
+ ext4fs_indir1_blkno = -1;
+ ext4fs_indir1_block = (uint32_t *) malloc(blksz);
+ if (ext4fs_indir1_block == NULL) {
+ printf("** SI ext2fs read block (indir 1):"
+ "malloc failed. **\n");
+ return -1;
+ }
+ ext4fs_indir1_size = blksz;
+ }
+ if ((__le32_to_cpu(inode->b.blocks.indir_block) <<
+ log2_blksz) != ext4fs_indir1_blkno) {
+ status = ext2fs_devread(__le32_to_cpu(inode->b.blocks.
+ indir_block) << log2_blksz, 0, blksz,
+ (char *) ext4fs_indir1_block);
+ if (status == 0) {
+ printf("** SI ext2fs read block (indir 1)"
+ "failed. **\n");
+ return 0;
+ }
+ ext4fs_indir1_blkno =
+ __le32_to_cpu(inode->b.blocks.
+ indir_block) << log2_blksz;
+ }
+ blknr = __le32_to_cpu(ext4fs_indir1_block
+ [fileblock - INDIRECT_BLOCKS]);
+ }
+ /* Double indirect. */
+ else if (fileblock <
+ (INDIRECT_BLOCKS + (blksz / 4 * (blksz / 4 + 1)))) {
+
+ long int perblock = blksz / 4;
+ long int rblock = fileblock - (INDIRECT_BLOCKS + blksz / 4);
+
+ if (ext4fs_indir1_block == NULL) {
+ ext4fs_indir1_block = (uint32_t *) malloc(blksz);
+ if (ext4fs_indir1_block == NULL) {
+ printf("** DI ext2fs read block (indir 2 1)"
+ "malloc failed. **\n");
+ return -1;
+ }
+ ext4fs_indir1_size = blksz;
+ ext4fs_indir1_blkno = -1;
+ }
+ if (blksz != ext4fs_indir1_size) {
+ free(ext4fs_indir1_block);
+ ext4fs_indir1_block = NULL;
+ ext4fs_indir1_size = 0;
+ ext4fs_indir1_blkno = -1;
+ ext4fs_indir1_block = (uint32_t *) malloc(blksz);
+ if (ext4fs_indir1_block == NULL) {
+ printf("** DI ext2fs read block (indir 2 1)"
+ "malloc failed. **\n");
+ return -1;
+ }
+ ext4fs_indir1_size = blksz;
+ }
+ if ((__le32_to_cpu(inode->b.blocks.double_indir_block) <<
+ log2_blksz) != ext4fs_indir1_blkno) {
+ status = ext2fs_devread(__le32_to_cpu(inode->b.blocks.
+ double_indir_block) << log2_blksz, 0, blksz,
+ (char *) ext4fs_indir1_block);
+ if (status == 0) {
+ printf("** DI ext2fs read block (indir 2 1)"
+ "failed. **\n");
+ return -1;
+ }
+ ext4fs_indir1_blkno =
+ __le32_to_cpu(inode->b.blocks.
+ double_indir_block) << log2_blksz;
+ }
+
+ if (ext4fs_indir2_block == NULL) {
+ ext4fs_indir2_block = (uint32_t *) malloc(blksz);
+ if (ext4fs_indir2_block == NULL) {
+ printf("** DI ext2fs read block (indir 2 2)"
+ "malloc failed. **\n");
+ return -1;
+ }
+ ext4fs_indir2_size = blksz;
+ ext4fs_indir2_blkno = -1;
+ }
+ if (blksz != ext4fs_indir2_size) {
+ free(ext4fs_indir2_block);
+ ext4fs_indir2_block = NULL;
+ ext4fs_indir2_size = 0;
+ ext4fs_indir2_blkno = -1;
+ ext4fs_indir2_block = (uint32_t *) malloc(blksz);
+ if (ext4fs_indir2_block == NULL) {
+ printf("** DI ext2fs read block (indir 2 2)"
+ "malloc failed. **\n");
+ return -1;
+ }
+ ext4fs_indir2_size = blksz;
+ }
+ if ((__le32_to_cpu(ext4fs_indir1_block[rblock / perblock]) <<
+ log2_blksz) != ext4fs_indir2_blkno) {
+ status = ext2fs_devread(__le32_to_cpu
+ (ext4fs_indir1_block
+ [rblock / perblock]) << log2_blksz,
+ 0, blksz, (char *) ext4fs_indir2_block);
+ if (status == 0) {
+ printf("** DI ext2fs read block (indir 2 2)"
+ "failed. **\n");
+ return -1;
+ }
+ ext4fs_indir2_blkno =
+ __le32_to_cpu(ext4fs_indir1_block[rblock
+ / perblock]) << log2_blksz;
+ }
+ blknr = __le32_to_cpu(ext4fs_indir2_block[rblock % perblock]);
+ }
+ /* Tripple indirect. */
+ else {
+ rblock = fileblock - (INDIRECT_BLOCKS + blksz / 4 +
+ (blksz / 4 * blksz / 4));
+ perblock_child = blksz / 4;
+ perblock_parent = ((blksz / 4) * (blksz / 4));
+
+ if (ext4fs_indir1_block == NULL) {
+ ext4fs_indir1_block = (uint32_t *) malloc(blksz);
+ if (ext4fs_indir1_block == NULL) {
+ printf("** TI ext2fs read block (indir 2 1)"
+ "malloc failed. **\n");
+ return -1;
+ }
+ ext4fs_indir1_size = blksz;
+ ext4fs_indir1_blkno = -1;
+ }
+ if (blksz != ext4fs_indir1_size) {
+ free(ext4fs_indir1_block);
+ ext4fs_indir1_block = NULL;
+ ext4fs_indir1_size = 0;
+ ext4fs_indir1_blkno = -1;
+ ext4fs_indir1_block = (uint32_t *) malloc(blksz);
+ if (ext4fs_indir1_block == NULL) {
+ printf("** TI ext2fs read block (indir 2 1)"
+ "malloc failed. **\n");
+ return -1;
+ }
+ ext4fs_indir1_size = blksz;
+ }
+ if ((__le32_to_cpu(inode->b.blocks.tripple_indir_block) <<
+ log2_blksz) != ext4fs_indir1_blkno) {
+ status = ext2fs_devread
+ (__le32_to_cpu(inode->b.blocks.
+ tripple_indir_block) << log2_blksz,
+ 0, blksz, (char *) ext4fs_indir1_block);
+ if (status == 0) {
+ printf("** TI ext2fs read block (indir 2 1)"
+ "failed. **\n");
+ return -1;
+ }
+ ext4fs_indir1_blkno =
+ __le32_to_cpu(inode->b.blocks.
+ tripple_indir_block) << log2_blksz;
+ }
+
+ if (ext4fs_indir2_block == NULL) {
+ ext4fs_indir2_block = (uint32_t *) malloc(blksz);
+ if (ext4fs_indir2_block == NULL) {
+ printf("** TI ext2fs read block (indir 2 2)"
+ "malloc failed. **\n");
+ return -1;
+ }
+ ext4fs_indir2_size = blksz;
+ ext4fs_indir2_blkno = -1;
+ }
+ if (blksz != ext4fs_indir2_size) {
+ free(ext4fs_indir2_block);
+ ext4fs_indir2_block = NULL;
+ ext4fs_indir2_size = 0;
+ ext4fs_indir2_blkno = -1;
+ ext4fs_indir2_block = (uint32_t *) malloc(blksz);
+ if (ext4fs_indir2_block == NULL) {
+ printf("** TI ext2fs read block (indir 2 2)"
+ "malloc failed. **\n");
+ return -1;
+ }
+ ext4fs_indir2_size = blksz;
+ }
+ if ((__le32_to_cpu(ext4fs_indir1_block[rblock /
+ perblock_parent]) << log2_blksz)
+ != ext4fs_indir2_blkno) {
+ status = ext2fs_devread(__le32_to_cpu
+ (ext4fs_indir1_block
+ [rblock / perblock_parent]) << log2_blksz,
+ 0, blksz, (char *) ext4fs_indir2_block);
+ if (status == 0) {
+ printf("** TI ext2fs read block (indir 2 2)"
+ "failed. **\n");
+ return -1;
+ }
+ ext4fs_indir2_blkno =
+ __le32_to_cpu(ext4fs_indir1_block[rblock /
+ perblock_parent]) << log2_blksz;
+ }
+
+ if (ext4fs_indir3_block == NULL) {
+ ext4fs_indir3_block = (uint32_t *) malloc(blksz);
+ if (ext4fs_indir3_block == NULL) {
+ printf("** TI ext2fs read block (indir 2 2)"
+ "malloc failed. **\n");
+ return -1;
+ }
+ ext4fs_indir3_size = blksz;
+ ext4fs_indir3_blkno = -1;
+ }
+ if (blksz != ext4fs_indir3_size) {
+ free(ext4fs_indir3_block);
+ ext4fs_indir3_block = NULL;
+ ext4fs_indir3_size = 0;
+ ext4fs_indir3_blkno = -1;
+ ext4fs_indir3_block = (uint32_t *) malloc(blksz);
+ if (ext4fs_indir3_block == NULL) {
+ printf("** TI ext2fs read block (indir 2 2)"
+ "malloc failed. **\n");
+ return -1;
+ }
+ ext4fs_indir3_size = blksz;
+ }
+ if ((__le32_to_cpu(ext4fs_indir2_block[rblock
+ / perblock_child]) << log2_blksz) != ext4fs_indir3_blkno){
+ status = ext2fs_devread(__le32_to_cpu
+ (ext4fs_indir2_block[(rblock / perblock_child)
+ % (blksz / 4)]) << log2_blksz,
+ 0, blksz, (char *) ext4fs_indir3_block);
+ if (status == 0) {
+ printf("** TI ext2fs read block (indir 2 2)"
+ "failed. **\n");
+ return -1;
+ }
+ ext4fs_indir3_blkno =
+ __le32_to_cpu(ext4fs_indir2_block[(rblock /
+ perblock_child) % (blksz / 4)]) << log2_blksz;
+ }
+
+ blknr = __le32_to_cpu(ext4fs_indir3_block
+ [rblock % perblock_child]);
+ }
+ debug("ext4fs_read_block %ld\n", blknr);
+ return blknr;
+}
+
+int ext4fs_close(void)
+{
+ if ((ext4fs_file != NULL) && (ext4fs_root != NULL)) {
+ ext4fs_free_node(ext4fs_file, &ext4fs_root->diropen);
+ ext4fs_file = NULL;
+ }
+ if (ext4fs_root != NULL) {
+ free(ext4fs_root);
+ ext4fs_root = NULL;
+ }
+ if (ext4fs_indir1_block != NULL) {
+ free(ext4fs_indir1_block);
+ ext4fs_indir1_block = NULL;
+ ext4fs_indir1_size = 0;
+ ext4fs_indir1_blkno = -1;
+ }
+ if (ext4fs_indir2_block != NULL) {
+ free(ext4fs_indir2_block);
+ ext4fs_indir2_block = NULL;
+ ext4fs_indir2_size = 0;
+ ext4fs_indir2_blkno = -1;
+ }
+ return 0;
+}
+
+int ext4fs_open(const char *filename)
+{
+ struct ext2fs_node *fdiro = NULL;
+ int status;
+ int len;
+
+ if (ext4fs_root == NULL)
+ return -1;
+
+ ext4fs_file = NULL;
+ status = ext2fs_find_file(filename, &ext4fs_root->diropen, &fdiro,
+ FILETYPE_REG);
+ if (status == 0)
+ goto fail;
+
+ if (!fdiro->inode_read) {
+ status = ext4fs_read_inode(fdiro->data, fdiro->ino,
+ &fdiro->inode);
+ if (status == 0)
+ goto fail;
+ }
+ len = __le32_to_cpu(fdiro->inode.size);
+ ext4fs_file = fdiro;
+ return len;
+
+fail:
+ ext4fs_free_node(fdiro, &ext4fs_root->diropen);
+ return -1;
+}
+
+int ext4fs_mount(unsigned part_length)
+{
+ struct ext2_data *data;
+ int status;
+ struct ext_filesystem *fs = get_fs();
+ data = malloc(sizeof(struct ext2_data));
+ if (!data)
+ return 0;
+
+ /* Read the superblock. */
+ status = ext2fs_devread(1 * 2, 0, sizeof(struct ext2_sblock),
+ (char *)&data->sblock);
+
+ if (status == 0)
+ goto fail;
+
+ /* Make sure this is an ext2 filesystem. */
+ if (__le16_to_cpu(data->sblock.magic) != EXT2_MAGIC)
+ goto fail;
+
+ if (__le32_to_cpu(data->sblock.revision_level == 0))
+ fs->inodesz = 128;
+ else
+ fs->inodesz = __le16_to_cpu(data->sblock.inode_size);
+
+#ifdef DEBUG
+ printf("EXT2 rev %d, inode_size %d\n",
+ __le32_to_cpu(data->sblock.revision_level), fs->inodesz);
+#endif
+ data->diropen.data = data;
+ data->diropen.ino = 2;
+ data->diropen.inode_read = 1;
+ data->inode = &data->diropen.inode;
+
+ status = ext4fs_read_inode(data, 2, data->inode);
+ if (status == 0)
+ goto fail;
+
+ inode_size = fs->inodesz;
+ ext4fs_root = data;
+ ext2fs_root = data;
+ return 1;
+
+fail:
+ printf("Failed to mount ext2 filesystem...\n");
+ free(data);
+
+ ext4fs_root = NULL;
+ return 0;
+}
diff --git a/fs/ext4/ext4_common.h b/fs/ext4/ext4_common.h
new file mode 100644
index 0000000..73f218d
--- /dev/null
+++ b/fs/ext4/ext4_common.h
@@ -0,0 +1,44 @@
+/*
+ * (C) Copyright 2011 Samsung Electronics
+ * EXT4 filesystem implementation in Uboot by
+ * Uma Shankar <uma.shankar(a)samsung.com>
+ * Manjunatha C Achar <a.manjunatha(a)samsung.com>
+ *
+ * Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __EXT4_COMMON__
+#define __EXT4_COMMON__
+#include <ext_common.h>
+#include <ext4fs.h>
+
+#define YES 1
+#define NO 0
+#define TRUE 1
+#define FALSE 0
+#define RECOVER 1
+#define SCAN 0
+
+#define S_IFLNK 0120000 /* symbolic link */
+#define BLOCK_NO_ONE 1
+#define SUPERBLOCK_SECTOR 2
+#define SUPERBLOCK_SIZE 1024
+#define F_FILE 1
+
+extern unsigned long part_offset;
+int ext4fs_read_inode(struct ext2_data *data, int ino,
+ struct ext2_inode *inode);
+#endif
diff --git a/fs/ext4/ext4fs.c b/fs/ext4/ext4fs.c
new file mode 100644
index 0000000..d4faa16
--- /dev/null
+++ b/fs/ext4/ext4fs.c
@@ -0,0 +1,215 @@
+/*
+ * (C) Copyright 2011 Samsung Electronics
+ * EXT4 filesystem implementation in Uboot by
+ * Uma Shankar <uma.shankar(a)samsung.com>
+ * Manjunatha C Achar <a.manjunatha(a)samsung.com>
+ *
+ * Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/*
+ * ext4load - based on code from GRUB2 fs/ext2.c
+*/
+#include <common.h>
+#include <malloc.h>
+#include <asm/byteorder.h>
+#include <linux/stat.h>
+#include <linux/time.h>
+#include <ext_common.h>
+#include <ext4fs.h>
+#include "ext4_common.h"
+
+int ext4fs_symlinknest;
+block_dev_desc_t *ext4_dev_desc;
+
+struct ext_filesystem *get_fs(void)
+{
+ if (ext4_dev_desc == NULL || ext4_dev_desc->priv == NULL)
+ printf("Invalid Input Arguments %s\n", __func__);
+ return (struct ext_filesystem *)ext4_dev_desc->priv;
+}
+
+int init_fs(block_dev_desc_t *dev_desc)
+{
+ struct ext_filesystem *fs;
+ if (dev_desc == NULL) {
+ printf("Invalid Input Arguments %s\n", __func__);
+ return -1;
+ }
+
+ fs = (struct ext_filesystem *)xzalloc(sizeof(struct ext_filesystem));
+ if (fs == NULL) {
+ printf("malloc failed: %s\n", __func__);
+ return -1;
+ }
+
+ fs->dev_desc = dev_desc;
+ dev_desc->priv = fs;
+ return 0;
+}
+
+void deinit_fs(block_dev_desc_t *dev_desc)
+{
+ if (dev_desc == NULL) {
+ printf("Invalid Input Arguments %s\n", __func__);
+ return;
+ }
+ if (dev_desc->priv)
+ free(dev_desc->priv);
+ return;
+}
+
+void ext4fs_free_node(struct ext2fs_node *node, struct ext2fs_node *currroot)
+{
+ if ((node != &ext4fs_root->diropen) && (node != currroot))
+ free(node);
+}
+
+/* Taken from openmoko-kernel mailing list: By Andy green
+* Optimized read file API : collects and defers contiguous sector
+* reads into one potentially more efficient larger sequential read action
+*/
+int ext4fs_read_file(struct ext2fs_node *node, int pos,
+ unsigned int len, char *buf)
+{
+ int i;
+ int blockcnt;
+ int log2blocksize = LOG2_EXT2_BLOCK_SIZE(node->data);
+ int blocksize = 1 << (log2blocksize + DISK_SECTOR_BITS);
+ unsigned int filesize = __le32_to_cpu(node->inode.size);
+ int previous_block_number = -1;
+ int delayed_start = 0;
+ int delayed_extent = 0;
+ int delayed_skipfirst = 0;
+ int delayed_next = 0;
+ char *delayed_buf = NULL;
+ short status;
+
+ /* Adjust len so it we can't read past the end of the file. */
+ if (len > filesize)
+ len = filesize;
+
+ blockcnt = ((len + pos) + blocksize - 1) / blocksize;
+
+ for (i = pos / blocksize; i < blockcnt; i++) {
+ int blknr;
+ int blockoff = pos % blocksize;
+ int blockend = blocksize;
+ int skipfirst = 0;
+ blknr = read_allocated_block(&(node->inode), i);
+ if (blknr < 0)
+ return -1;
+
+ blknr = blknr << log2blocksize;
+
+ /* Last block. */
+ if (i == blockcnt - 1) {
+ blockend = (len + pos) % blocksize;
+
+ /* The last portion is exactly blocksize. */
+ if (!blockend)
+ blockend = blocksize;
+ }
+
+ /* First block. */
+ if (i == pos / blocksize) {
+ skipfirst = blockoff;
+ blockend -= skipfirst;
+ }
+ if (blknr) {
+ int status;
+
+ if (previous_block_number != -1) {
+ if (delayed_next == blknr) {
+ delayed_extent += blockend;
+ delayed_next += blockend >> SECTOR_BITS;
+ } else { /* spill */
+ status = ext2fs_devread(delayed_start,
+ delayed_skipfirst,
+ delayed_extent,
+ delayed_buf);
+ if (status == 0)
+ return -1;
+ previous_block_number = blknr;
+ delayed_start = blknr;
+ delayed_extent = blockend;
+ delayed_skipfirst = skipfirst;
+ delayed_buf = buf;
+ delayed_next = blknr +
+ (blockend >> SECTOR_BITS);
+ }
+ } else {
+ previous_block_number = blknr;
+ delayed_start = blknr;
+ delayed_extent = blockend;
+ delayed_skipfirst = skipfirst;
+ delayed_buf = buf;
+ delayed_next = blknr +
+ (blockend >> SECTOR_BITS);
+ }
+ } else {
+ if (previous_block_number != -1) {
+ /* spill */
+ status = ext2fs_devread(delayed_start,
+ delayed_skipfirst,
+ delayed_extent,
+ delayed_buf);
+ if (status == 0)
+ return -1;
+ previous_block_number = -1;
+ }
+ memset(buf, 0, blocksize - skipfirst);
+ }
+ buf += blocksize - skipfirst;
+ }
+ if (previous_block_number != -1) {
+ /* spill */
+ status = ext2fs_devread(delayed_start,
+ delayed_skipfirst, delayed_extent,
+ delayed_buf);
+ if (status == 0)
+ return -1;
+ previous_block_number = -1;
+ }
+ return len;
+}
+
+int ext4fs_ls(const char *dirname)
+{
+ struct ext2fs_node *dirnode;
+ int status;
+
+ if (dirname == NULL)
+ return 0;
+
+ status = ext2fs_find_file(dirname, &ext4fs_root->diropen, &dirnode,
+ FILETYPE_DIRECTORY);
+ if (status != 1) {
+ printf("** Can not find directory. **\n");
+ return 1;
+ }
+
+ ext2fs_iterate_dir(dirnode, NULL, NULL, NULL);
+ ext4fs_free_node(dirnode, &ext4fs_root->diropen);
+ return 0;
+}
+
+int ext4fs_read(char *buf, unsigned len)
+{
+ if (ext4fs_root == NULL || ext4fs_file == NULL)
+ return 0;
+ return ext4fs_read_file(ext4fs_file, 0, len, buf);
+}
diff --git a/include/ext2fs.h b/include/ext2fs.h
index 163a9bb..7d4834c 100644
--- a/include/ext2fs.h
+++ b/include/ext2fs.h
@@ -25,6 +25,8 @@
* from the original ext2 fs code, as found in the linux kernel.
*/
+#ifndef __EXT2__
+#define __EXT2__
#define SECTOR_SIZE 0x200
#define SECTOR_BITS 9
@@ -68,14 +70,12 @@ typedef enum
ERR_DEV_NEED_INIT,
ERR_NO_DISK_SPACE,
ERR_NUMBER_OVERFLOW,
-
MAX_ERR_NUM
} ext2fs_error_t;
-
-extern int ext2fs_set_blk_dev(block_dev_desc_t *rbdd, int part);
-extern int ext2fs_ls (const char *dirname);
-extern int ext2fs_open (const char *filename);
-extern int ext2fs_read (char *buf, unsigned len);
-extern int ext2fs_mount (unsigned part_length);
-extern int ext2fs_close(void);
+int ext2fs_ls(const char *dirname);
+int ext2fs_open(const char *filename);
+int ext2fs_read(char *buf, unsigned len);
+int ext2fs_close(void);
+int ext2_register_device(block_dev_desc_t *dev_desc, int part_no);
+#endif
diff --git a/include/ext4fs.h b/include/ext4fs.h
new file mode 100644
index 0000000..fd7bd47
--- /dev/null
+++ b/include/ext4fs.h
@@ -0,0 +1,116 @@
+/*
+ * (C) Copyright 2011 Samsung Electronics
+ * EXT4 filesystem implementation in Uboot by
+ * Uma Shankar <uma.shankar(a)samsung.com>
+ * Manjunatha C Achar <a.manjunatha(a)samsung.com>
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Some parts of this code (mainly the structures and defines) are
+ * from the original ext4 fs code, as found in the linux kernel.
+ * Reference for ext4load and ls features have ben taken from GRUB
+ */
+
+#ifndef __EXT4__
+#define __EXT4__
+#include <ext_common.h>
+
+#define EXT4_EXTENTS_FLAG 0x80000
+#define EXT4_EXT_MAGIC 0xf30a
+#define EXT4_FEATURE_RO_COMPAT_GDT_CSUM 0x0010
+#define EXT4_FEATURE_INCOMPAT_EXTENTS 0x0040
+#define EXT4_INDIRECT_BLOCKS 12
+
+#define EXT4_BG_INODE_UNINIT 0x0001
+#define EXT4_BG_BLOCK_UNINIT 0x0002
+#define EXT4_BG_INODE_ZEROED 0x0004
+
+struct ext4_extent_header {
+ uint16_t magic;
+ uint16_t entries;
+ uint16_t max;
+ uint16_t depth;
+ uint32_t generation;
+};
+
+struct ext4_extent {
+ uint32_t block;
+ uint16_t len;
+ uint16_t start_hi;
+ uint32_t start;
+};
+
+struct ext4_extent_idx {
+ uint32_t block;
+ uint32_t leaf;
+ uint16_t leaf_hi;
+ uint16_t unused;
+};
+
+struct ext_filesystem {
+ /*Total Sector of partition */
+ uint64_t total_sect;
+ /*Block size of partition */
+ uint32_t blksz;
+ /*Inode size of partition */
+ uint32_t inodesz;
+ /*Sectors per Block */
+ uint32_t sect_perblk;
+ /*Group Descriptor Block Number */
+ uint32_t gdtable_blkno;
+ /*Total block groups of partition */
+ uint32_t no_blkgrp;
+ /*No of blocks required for bgdtable */
+ uint32_t no_blk_pergdt;
+ /*superblock */
+ struct ext2_sblock *sb;
+ /*block group descritpor table */
+ struct ext2_block_group *gd;
+ char *gdtable;
+
+ /*Block Bitmap Related */
+ unsigned char **blk_bmaps;
+ long int curr_blkno;
+ uint16_t first_pass_bbmap;
+
+ /*Inode Bitmap Related */
+ unsigned char **inode_bmaps;
+ int curr_inode_no;
+ uint16_t first_pass_ibmap;
+
+ /*Journal Related */
+
+ /*Block Device Descriptor */
+ block_dev_desc_t *dev_desc;
+};
+
+/*############################*/
+extern block_dev_desc_t *ext4_dev_desc;
+/*#########################*/
+
+extern struct ext2_data *ext4fs_root;
+extern struct ext2fs_node *ext4fs_file;
+struct ext_filesystem *get_fs(void);
+int init_fs(block_dev_desc_t *);
+void deinit_fs(block_dev_desc_t *);
+int ext4fs_open(const char *filename);
+int ext4fs_read(char *buf, unsigned len);
+int ext4fs_mount(unsigned part_length);
+int ext4fs_close(void);
+int ext4fs_ls(const char *dirname);
+void ext4fs_free_node(struct ext2fs_node *node, struct ext2fs_node *currroot);
+extern int ext2fs_devread(int sector, int byte_offset, int byte_len, char *buf);
+extern void *xzalloc(size_t size);
+#endif
diff --git a/include/ext_common.h b/include/ext_common.h
new file mode 100644
index 0000000..8b0474c
--- /dev/null
+++ b/include/ext_common.h
@@ -0,0 +1,199 @@
+/*
+ * (C) Copyright 2011 Samsung Electronics
+ * EXT4 filesystem implementation in Uboot by
+ * Uma Shankar <uma.shankar(a)samsung.com>
+ * Manjunatha C Achar <a.manjunatha(a)samsung.com>
+ *
+ * Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+/* Some parts of this code (mainly the structures and defines) are
+ * from the original ext2 fs code, as found in the linux kernel.
+ */
+
+#ifndef __EXT_COMMON__
+#define __EXT_COMMON__
+
+#define SECTOR_SIZE 0x200
+#define SECTOR_BITS 9
+
+/* Magic value used to identify an ext2 filesystem. */
+#define EXT2_MAGIC 0xEF53
+/* Amount of indirect blocks in an inode. */
+#define INDIRECT_BLOCKS 12
+/* Maximum lenght of a pathname. */
+#define EXT2_PATH_MAX 4096
+/* Maximum nesting of symlinks, used to prevent a loop. */
+#define EXT2_MAX_SYMLINKCNT 8
+
+/* Filetype used in directory entry. */
+#define FILETYPE_UNKNOWN 0
+#define FILETYPE_REG 1
+#define FILETYPE_DIRECTORY 2
+#define FILETYPE_SYMLINK 7
+
+/* Filetype information as used in inodes. */
+#define FILETYPE_INO_MASK 0170000
+#define FILETYPE_INO_REG 0100000
+#define FILETYPE_INO_DIRECTORY 0040000
+#define FILETYPE_INO_SYMLINK 0120000
+#define EXT2_ROOT_INO 2 /* Root inode */
+
+/* Bits used as offset in sector */
+#define DISK_SECTOR_BITS 9
+/* The size of an ext2 block in bytes. */
+#define EXT2_BLOCK_SIZE(data) (1 << LOG2_BLOCK_SIZE(data))
+
+/* Log2 size of ext2 block in 512 blocks. */
+#define LOG2_EXT2_BLOCK_SIZE(data) (__le32_to_cpu \
+ (data->sblock.log2_block_size) + 1)
+
+/* Log2 size of ext2 block in bytes. */
+#define LOG2_BLOCK_SIZE(data) (__le32_to_cpu \
+ (data->sblock.log2_block_size) + 10)
+#define INODE_SIZE_FILESYSTEM(data) (__le32_to_cpu \
+ (data->sblock.inode_size))
+
+#define EXT2_FT_DIR 2
+#define SUCCESS 1
+/*
+ * Macro-instructions used to manage several block sizes
+ */
+#define EXT2_MIN_BLOCK_LOG_SIZE 10 /* 1024 */
+#define EXT2_MAX_BLOCK_LOG_SIZE 16 /* 65536 */
+#define EXT2_MIN_BLOCK_SIZE (1 << EXT2_MIN_BLOCK_LOG_SIZE)
+#define EXT2_MAX_BLOCK_SIZE (1 << EXT2_MAX_BLOCK_LOG_SIZE)
+
+/* The ext2 superblock. */
+struct ext2_sblock {
+ uint32_t total_inodes;
+ uint32_t total_blocks;
+ uint32_t reserved_blocks;
+ uint32_t free_blocks;
+ uint32_t free_inodes;
+ uint32_t first_data_block;
+ uint32_t log2_block_size;
+ uint32_t log2_fragment_size;
+ uint32_t blocks_per_group;
+ uint32_t fragments_per_group;
+ uint32_t inodes_per_group;
+ uint32_t mtime;
+ uint32_t utime;
+ uint16_t mnt_count;
+ uint16_t max_mnt_count;
+ uint16_t magic;
+ uint16_t fs_state;
+ uint16_t error_handling;
+ uint16_t minor_revision_level;
+ uint32_t lastcheck;
+ uint32_t checkinterval;
+ uint32_t creator_os;
+ uint32_t revision_level;
+ uint16_t uid_reserved;
+ uint16_t gid_reserved;
+ uint32_t first_inode;
+ uint16_t inode_size;
+ uint16_t block_group_number;
+ uint32_t feature_compatibility;
+ uint32_t feature_incompat;
+ uint32_t feature_ro_compat;
+ uint32_t unique_id[4];
+ char volume_name[16];
+ char last_mounted_on[64];
+ uint32_t compression_info;
+};
+
+struct ext2_block_group {
+ __u32 block_id; /* Blocks bitmap block */
+ __u32 inode_id; /* Inodes bitmap block */
+ __u32 inode_table_id; /* Inodes table block */
+ __u16 free_blocks; /* Free blocks count */
+ __u16 free_inodes; /* Free inodes count */
+ __u16 used_dir_cnt; /* Directories count */
+ __u16 bg_flags;
+ __u32 bg_reserved[2];
+ __u16 bg_itable_unused; /* Unused inodes count */
+ __u16 bg_checksum; /* crc16(s_uuid+grouo_num+group_desc)*/
+};
+
+/* The ext2 inode. */
+struct ext2_inode {
+ uint16_t mode;
+ uint16_t uid;
+ uint32_t size;
+ uint32_t atime;
+ uint32_t ctime;
+ uint32_t mtime;
+ uint32_t dtime;
+ uint16_t gid;
+ uint16_t nlinks;
+ uint32_t blockcnt; /* Blocks of 512 bytes!! */
+ uint32_t flags;
+ uint32_t osd1;
+ union {
+ struct datablocks {
+ uint32_t dir_blocks[INDIRECT_BLOCKS];
+ uint32_t indir_block;
+ uint32_t double_indir_block;
+ uint32_t tripple_indir_block;
+ } blocks;
+ char symlink[60];
+ } b;
+ uint32_t version;
+ uint32_t acl;
+ uint32_t dir_acl;
+ uint32_t fragment_addr;
+ uint32_t osd2[3];
+};
+
+/* The header of an ext2 directory entry. */
+struct ext2_dirent {
+ uint32_t inode;
+ uint16_t direntlen;
+ uint8_t namelen;
+ uint8_t filetype;
+};
+
+struct ext2fs_node {
+ struct ext2_data *data;
+ struct ext2_inode inode;
+ int ino;
+ int inode_read;
+};
+
+/* Information about a "mounted" ext2 filesystem. */
+struct ext2_data {
+ struct ext2_sblock sblock;
+ struct ext2_inode *inode;
+ struct ext2fs_node diropen;
+};
+
+extern unsigned int inode_size;
+extern struct ext2_data *ext2fs_root;
+extern struct ext2_data *ext4fs_root;
+extern int ext2fs_iterate_dir(struct ext2fs_node *dir, char *name,
+ struct ext2fs_node **fnode, int *ftype);
+extern int ext2fs_find_file(const char *path, struct ext2fs_node *rootnode,
+ struct ext2fs_node **foundnode, int expecttype);
+extern int ext2fs_devread(int sector, int byte_offset, int byte_len, char *buf);
+int ext2fs_set_blk_dev(block_dev_desc_t *rbdd, int part);
+uint32_t div_roundup(uint32_t size, uint32_t n);
+long int read_allocated_block(struct ext2_inode *inode, int fileblock);
+int ext2fs_mount(unsigned part_length);
+void *xmalloc(size_t size);
+void *xzalloc(size_t size);
+#endif
--
1.7.0.4
9
27

[U-Boot] [PATCH v1 0/5] env: handle special variables and selective env default
by Gerlando Falauto 18 Sep '12
by Gerlando Falauto 18 Sep '12
18 Sep '12
This patchset modifies the handling of all the operations on the environment
(set/import/default) so to unify handling of special variables.
On top of that we implement a selective "env default".
A selective "env import" would imply a user API change and should therefore
be discussed separately.
Changes in the syntax (user API):
- "env default" -f: override write-once variables, -a means all
First patch is a cosmetic prerequisite to the second patch
which constifies serial_assign().
Changes from v0:
- checkpatch cleanup
- removed himport_ex()
- removed warning for serial_assign()
- env import NOT implemented here
Gerlando Falauto (5):
serial: cosmetic checkpatch compliance
serial: constify serial_assign()
env: unify logic to check and apply changes
env: check and apply changes on delete/destroy
env: make "env default" selective, check and apply
README | 2 +
common/cmd_nvedit.c | 209 +++++++++++++++++++++++++++++++---------------
common/env_common.c | 35 +++++++-
common/serial.c | 51 ++++++------
include/config_cmd_all.h | 1 +
include/environment.h | 12 +++
include/search.h | 23 +++++-
include/serial.h | 19 ++--
lib/hashtable.c | 61 ++++++++++++--
9 files changed, 300 insertions(+), 113 deletions(-)
8
103