Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
5b2354f4
Commit
5b2354f4
authored
Jul 16, 2004
by
David Woodhouse
Committed by
Linus Torvalds
Jul 16, 2004
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
M-Systems DiskOnChip driver: fix DiskOnChip Millennium ECC support
and fix a few compiler warnings while we're at it.
parent
0d70f22a
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
11 additions
and
19 deletions
+11
-19
drivers/mtd/nand/diskonchip.c
drivers/mtd/nand/diskonchip.c
+11
-19
No files found.
drivers/mtd/nand/diskonchip.c
View file @
5b2354f4
...
@@ -7,7 +7,7 @@
...
@@ -7,7 +7,7 @@
*
*
* Interface to generic NAND code for M-Systems DiskOnChip devices
* Interface to generic NAND code for M-Systems DiskOnChip devices
*
*
* $Id: diskonchip.c,v 1.2
3 2004/07/13 00:14:35
dbrown Exp $
* $Id: diskonchip.c,v 1.2
5 2004/07/16 13:54:27
dbrown Exp $
*/
*/
#include <linux/kernel.h>
#include <linux/kernel.h>
...
@@ -382,7 +382,7 @@ static void doc2001_readbuf(struct mtd_info *mtd,
...
@@ -382,7 +382,7 @@ static void doc2001_readbuf(struct mtd_info *mtd,
ReadDOC
(
docptr
,
ReadPipeInit
);
ReadDOC
(
docptr
,
ReadPipeInit
);
for
(
i
=
0
;
i
<
len
-
1
;
i
++
)
for
(
i
=
0
;
i
<
len
-
1
;
i
++
)
buf
[
i
]
=
ReadDOC
(
docptr
,
Mil_CDSN_IO
);
buf
[
i
]
=
ReadDOC
(
docptr
,
Mil_CDSN_IO
+
(
i
&
0xff
)
);
/* Terminate read pipeline */
/* Terminate read pipeline */
buf
[
i
]
=
ReadDOC
(
docptr
,
LastDataRead
);
buf
[
i
]
=
ReadDOC
(
docptr
,
LastDataRead
);
...
@@ -654,7 +654,7 @@ static int __init find_media_headers(struct mtd_info *mtd, u_char *buf,
...
@@ -654,7 +654,7 @@ static int __init find_media_headers(struct mtd_info *mtd, u_char *buf,
int
offs
,
end
=
(
MAX_MEDIAHEADER_SCAN
<<
this
->
phys_erase_shift
);
int
offs
,
end
=
(
MAX_MEDIAHEADER_SCAN
<<
this
->
phys_erase_shift
);
int
ret
,
retlen
;
int
ret
,
retlen
;
end
=
min
(
end
,
mtd
->
size
);
// paranoia
end
=
min
(
end
,
(
int
)
mtd
->
size
);
// paranoia
for
(
offs
=
0
;
offs
<
end
;
offs
+=
mtd
->
erasesize
)
{
for
(
offs
=
0
;
offs
<
end
;
offs
+=
mtd
->
erasesize
)
{
ret
=
mtd
->
read
(
mtd
,
offs
,
mtd
->
oobblock
,
&
retlen
,
buf
);
ret
=
mtd
->
read
(
mtd
,
offs
,
mtd
->
oobblock
,
&
retlen
,
buf
);
if
(
retlen
!=
mtd
->
oobblock
)
continue
;
if
(
retlen
!=
mtd
->
oobblock
)
continue
;
...
@@ -714,7 +714,7 @@ static inline int __init nftl_partscan(struct mtd_info *mtd,
...
@@ -714,7 +714,7 @@ static inline int __init nftl_partscan(struct mtd_info *mtd,
//#endif
//#endif
blocks
=
mtd
->
size
>>
this
->
phys_erase_shift
;
blocks
=
mtd
->
size
>>
this
->
phys_erase_shift
;
maxblocks
=
min
(
32768
,
mtd
->
erasesize
-
psize
);
maxblocks
=
min
(
32768
,
(
int
)
mtd
->
erasesize
-
psize
);
if
(
mh
->
UnitSizeFactor
==
0x00
)
{
if
(
mh
->
UnitSizeFactor
==
0x00
)
{
/* Auto-determine UnitSizeFactor. The constraints are:
/* Auto-determine UnitSizeFactor. The constraints are:
...
@@ -741,7 +741,7 @@ static inline int __init nftl_partscan(struct mtd_info *mtd,
...
@@ -741,7 +741,7 @@ static inline int __init nftl_partscan(struct mtd_info *mtd,
mtd
->
erasesize
<<=
(
0xff
-
mh
->
UnitSizeFactor
);
mtd
->
erasesize
<<=
(
0xff
-
mh
->
UnitSizeFactor
);
printk
(
KERN_INFO
"Setting virtual erase size to %d
\n
"
,
mtd
->
erasesize
);
printk
(
KERN_INFO
"Setting virtual erase size to %d
\n
"
,
mtd
->
erasesize
);
blocks
=
mtd
->
size
>>
this
->
bbt_erase_shift
;
blocks
=
mtd
->
size
>>
this
->
bbt_erase_shift
;
maxblocks
=
min
(
32768
,
mtd
->
erasesize
-
psize
);
maxblocks
=
min
(
32768
,
(
int
)
mtd
->
erasesize
-
psize
);
}
}
if
(
blocks
>
maxblocks
)
{
if
(
blocks
>
maxblocks
)
{
...
@@ -933,17 +933,6 @@ static int __init inftl_scan_bbt(struct mtd_info *mtd)
...
@@ -933,17 +933,6 @@ static int __init inftl_scan_bbt(struct mtd_info *mtd)
return
-
EIO
;
return
-
EIO
;
}
}
if
(
mtd
->
size
==
(
8
<<
20
))
{
#if 0
/* This doesn't seem to work for me. I get ECC errors on every page. */
/* The Millennium 8MiB is actually an NFTL device! */
mtd->name = "DiskOnChip Millennium 8MiB (NFTL)";
return nftl_scan_bbt(mtd);
#endif
printk
(
KERN_ERR
"DiskOnChip Millennium 8MiB is not supported.
\n
"
);
return
-
EIO
;
}
this
->
bbt_td
->
options
=
NAND_BBT_LASTBLOCK
|
NAND_BBT_8BIT
|
this
->
bbt_td
->
options
=
NAND_BBT_LASTBLOCK
|
NAND_BBT_8BIT
|
NAND_BBT_VERSION
;
NAND_BBT_VERSION
;
if
(
inftl_bbt_write
)
if
(
inftl_bbt_write
)
...
@@ -1011,7 +1000,6 @@ static inline int __init doc2001_init(struct mtd_info *mtd)
...
@@ -1011,7 +1000,6 @@ static inline int __init doc2001_init(struct mtd_info *mtd)
this
->
write_buf
=
doc2001_writebuf
;
this
->
write_buf
=
doc2001_writebuf
;
this
->
read_buf
=
doc2001_readbuf
;
this
->
read_buf
=
doc2001_readbuf
;
this
->
verify_buf
=
doc2001_verifybuf
;
this
->
verify_buf
=
doc2001_verifybuf
;
this
->
scan_bbt
=
inftl_scan_bbt
;
ReadDOC
(
doc
->
virtadr
,
ChipID
);
ReadDOC
(
doc
->
virtadr
,
ChipID
);
ReadDOC
(
doc
->
virtadr
,
ChipID
);
ReadDOC
(
doc
->
virtadr
,
ChipID
);
...
@@ -1023,11 +1011,13 @@ static inline int __init doc2001_init(struct mtd_info *mtd)
...
@@ -1023,11 +1011,13 @@ static inline int __init doc2001_init(struct mtd_info *mtd)
can have multiple chips. */
can have multiple chips. */
doc2000_count_chips
(
mtd
);
doc2000_count_chips
(
mtd
);
mtd
->
name
=
"DiskOnChip 2000 (INFTL Model)"
;
mtd
->
name
=
"DiskOnChip 2000 (INFTL Model)"
;
this
->
scan_bbt
=
inftl_scan_bbt
;
return
(
4
*
doc
->
chips_per_floor
);
return
(
4
*
doc
->
chips_per_floor
);
}
else
{
}
else
{
/* Bog-standard Millennium */
/* Bog-standard Millennium */
doc
->
chips_per_floor
=
1
;
doc
->
chips_per_floor
=
1
;
mtd
->
name
=
"DiskOnChip Millennium"
;
mtd
->
name
=
"DiskOnChip Millennium"
;
this
->
scan_bbt
=
nftl_scan_bbt
;
return
1
;
return
1
;
}
}
}
}
...
@@ -1096,14 +1086,16 @@ static inline int __init doc_probe(unsigned long physadr)
...
@@ -1096,14 +1086,16 @@ static inline int __init doc_probe(unsigned long physadr)
}
}
for
(
mtd
=
doclist
;
mtd
;
mtd
=
doc
->
nextdoc
)
{
for
(
mtd
=
doclist
;
mtd
;
mtd
=
doc
->
nextdoc
)
{
unsigned
char
oldval
;
unsigned
char
newval
;
nand
=
mtd
->
priv
;
nand
=
mtd
->
priv
;
doc
=
(
void
*
)
nand
->
priv
;
doc
=
(
void
*
)
nand
->
priv
;
/* Use the alias resolution register to determine if this is
/* Use the alias resolution register to determine if this is
in fact the same DOC aliased to a new address. If writes
in fact the same DOC aliased to a new address. If writes
to one chip's alias resolution register change the value on
to one chip's alias resolution register change the value on
the other chip, they're the same chip. */
the other chip, they're the same chip. */
unsigned
char
oldval
=
ReadDOC
(
doc
->
virtadr
,
AliasResolution
);
oldval
=
ReadDOC
(
doc
->
virtadr
,
AliasResolution
);
unsigned
char
newval
=
ReadDOC
(
virtadr
,
AliasResolution
);
newval
=
ReadDOC
(
virtadr
,
AliasResolution
);
if
(
oldval
!=
newval
)
if
(
oldval
!=
newval
)
continue
;
continue
;
WriteDOC
(
~
newval
,
virtadr
,
AliasResolution
);
WriteDOC
(
~
newval
,
virtadr
,
AliasResolution
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment