Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
L
Linux Next
Manage
Activity
Members
Labels
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Cristian Ciocaltea
Linux Next
Commits
532a37cf
Commit
532a37cf
authored
19 years ago
by
Kyungmin Park
Committed by
Linus Torvalds
19 years ago
Browse files
Options
Downloads
Patches
Plain Diff
[PATCH] mtd onenand driver: reduce stack usage
Signed-off-by:
Linus Torvalds
<
torvalds@osdl.org
>
parent
20ba89a3
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
drivers/mtd/onenand/onenand_base.c
+24
-3
24 additions, 3 deletions
drivers/mtd/onenand/onenand_base.c
drivers/mtd/onenand/onenand_bbt.c
+2
-2
2 additions, 2 deletions
drivers/mtd/onenand/onenand_bbt.c
include/linux/mtd/onenand.h
+2
-2
2 additions, 2 deletions
include/linux/mtd/onenand.h
with
28 additions
and
7 deletions
drivers/mtd/onenand/onenand_base.c
+
24
−
3
View file @
532a37cf
...
...
@@ -940,7 +940,7 @@ static int onenand_writev_ecc(struct mtd_info *mtd, const struct kvec *vecs,
u_char
*
eccbuf
,
struct
nand_oobinfo
*
oobsel
)
{
struct
onenand_chip
*
this
=
mtd
->
priv
;
unsigned
char
buffer
[
MAX_ONENAND_PAGESIZE
],
*
pbuf
;
unsigned
char
*
pbuf
;
size_t
total_len
,
len
;
int
i
,
written
=
0
;
int
ret
=
0
;
...
...
@@ -975,7 +975,7 @@ static int onenand_writev_ecc(struct mtd_info *mtd, const struct kvec *vecs,
/* Loop until all keve's data has been written */
len
=
0
;
while
(
count
)
{
pbuf
=
buf
fer
;
pbuf
=
this
->
page_
buf
;
/*
* If the given tuple is >= pagesize then
* write it out from the iov
...
...
@@ -995,7 +995,7 @@ static int onenand_writev_ecc(struct mtd_info *mtd, const struct kvec *vecs,
int
cnt
=
0
,
thislen
;
while
(
cnt
<
mtd
->
oobblock
)
{
thislen
=
min_t
(
int
,
mtd
->
oobblock
-
cnt
,
vecs
->
iov_len
-
len
);
memcpy
(
buf
fer
+
cnt
,
vecs
->
iov_base
+
len
,
thislen
);
memcpy
(
this
->
page_
buf
+
cnt
,
vecs
->
iov_base
+
len
,
thislen
);
cnt
+=
thislen
;
len
+=
thislen
;
...
...
@@ -1519,6 +1519,18 @@ int onenand_scan(struct mtd_info *mtd, int maxchips)
this
->
read_bufferram
=
onenand_sync_read_bufferram
;
}
/* Allocate buffers, if necessary */
if
(
!
this
->
page_buf
)
{
size_t
len
;
len
=
mtd
->
oobblock
+
mtd
->
oobsize
;
this
->
page_buf
=
kmalloc
(
len
,
GFP_KERNEL
);
if
(
!
this
->
page_buf
)
{
printk
(
KERN_ERR
"onenand_scan(): Can't allocate page_buf
\n
"
);
return
-
ENOMEM
;
}
this
->
options
|=
ONENAND_PAGEBUF_ALLOC
;
}
this
->
state
=
FL_READY
;
init_waitqueue_head
(
&
this
->
wq
);
spin_lock_init
(
&
this
->
chip_lock
);
...
...
@@ -1580,12 +1592,21 @@ int onenand_scan(struct mtd_info *mtd, int maxchips)
*/
void
onenand_release
(
struct
mtd_info
*
mtd
)
{
struct
onenand_chip
*
this
=
mtd
->
priv
;
#ifdef CONFIG_MTD_PARTITIONS
/* Deregister partitions */
del_mtd_partitions
(
mtd
);
#endif
/* Deregister the device */
del_mtd_device
(
mtd
);
/* Free bad block table memory, if allocated */
if
(
this
->
bbm
)
kfree
(
this
->
bbm
);
/* Buffer allocated by onenand_scan */
if
(
this
->
options
&
ONENAND_PAGEBUF_ALLOC
)
kfree
(
this
->
page_buf
);
}
EXPORT_SYMBOL_GPL
(
onenand_scan
);
...
...
This diff is collapsed.
Click to expand it.
drivers/mtd/onenand/onenand_bbt.c
+
2
−
2
View file @
532a37cf
...
...
@@ -118,10 +118,10 @@ static int create_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr
*/
static
inline
int
onenand_memory_bbt
(
struct
mtd_info
*
mtd
,
struct
nand_bbt_descr
*
bd
)
{
unsigned
char
data_buf
[
MAX_ONENAND_PAGESIZE
]
;
struct
onenand_chip
*
this
=
mtd
->
priv
;
bd
->
options
&=
~
NAND_BBT_SCANEMPTY
;
return
create_bbt
(
mtd
,
data
_buf
,
bd
,
-
1
);
return
create_bbt
(
mtd
,
this
->
page
_buf
,
bd
,
-
1
);
}
/**
...
...
This diff is collapsed.
Click to expand it.
include/linux/mtd/onenand.h
+
2
−
2
View file @
532a37cf
...
...
@@ -17,7 +17,6 @@
#include
<linux/mtd/bbm.h>
#define MAX_BUFFERRAM 2
#define MAX_ONENAND_PAGESIZE (2048 + 64)
/* Scan and identify a OneNAND device */
extern
int
onenand_scan
(
struct
mtd_info
*
mtd
,
int
max_chips
);
...
...
@@ -110,6 +109,7 @@ struct onenand_chip {
spinlock_t
chip_lock
;
wait_queue_head_t
wq
;
onenand_state_t
state
;
unsigned
char
*
page_buf
;
struct
nand_oobinfo
*
autooob
;
...
...
@@ -134,7 +134,7 @@ struct onenand_chip {
* Options bits
*/
#define ONENAND_CONT_LOCK (0x0001)
#define ONENAND_PAGEBUF_ALLOC (0x1000)
/*
* OneNAND Flash Manufacturer ID Codes
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment