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
201ee40f
Commit
201ee40f
authored
Sep 18, 2004
by
Russell King
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[MMC] Add v2.x and v3.x CID parsing.
parent
b41465f9
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
99 additions
and
36 deletions
+99
-36
drivers/mmc/mmc.c
drivers/mmc/mmc.c
+87
-28
drivers/mmc/mmc_sysfs.c
drivers/mmc/mmc_sysfs.c
+8
-5
include/linux/mmc/card.h
include/linux/mmc/card.h
+4
-3
No files found.
drivers/mmc/mmc.c
View file @
201ee40f
...
@@ -300,51 +300,110 @@ static u32 mmc_select_voltage(struct mmc_host *host, u32 ocr)
...
@@ -300,51 +300,110 @@ static u32 mmc_select_voltage(struct mmc_host *host, u32 ocr)
return
ocr
;
return
ocr
;
}
}
#define UNSTUFF_BITS(resp,start,size) \
({ \
const u32 __mask = (1 << (size)) - 1; \
const int __off = 3 - ((start) / 32); \
const int __shft = (start) & 31; \
u32 __res; \
\
__res = resp[__off] >> __shft; \
if ((size) + __shft >= 32) \
__res |= resp[__off-1] << (32 - __shft); \
__res & __mask; \
})
/*
* Given the decoded CSD structure, decode the raw CID to our CID structure.
*/
static
void
mmc_decode_cid
(
struct
mmc_card
*
card
)
static
void
mmc_decode_cid
(
struct
mmc_card
*
card
)
{
{
struct
mmc_cid
*
cid
=
&
card
->
cid
;
u32
*
resp
=
card
->
raw_cid
;
u32
*
resp
=
card
->
raw_cid
;
memset
(
cid
,
0
,
sizeof
(
struct
mmc_cid
));
memset
(
&
card
->
cid
,
0
,
sizeof
(
struct
mmc_cid
));
cid
->
manfid
=
resp
[
0
]
>>
8
;
/*
cid
->
prod_name
[
0
]
=
resp
[
0
];
* The selection of the format here is guesswork based upon
cid
->
prod_name
[
1
]
=
resp
[
1
]
>>
24
;
* information people have sent to date.
cid
->
prod_name
[
2
]
=
resp
[
1
]
>>
16
;
*/
cid
->
prod_name
[
3
]
=
resp
[
1
]
>>
8
;
switch
(
card
->
csd
.
mmca_vsn
)
{
cid
->
prod_name
[
4
]
=
resp
[
1
];
case
0
:
/* MMC v1.? */
cid
->
prod_name
[
5
]
=
resp
[
2
]
>>
24
;
case
1
:
/* MMC v1.4 */
cid
->
prod_name
[
6
]
=
resp
[
2
]
>>
16
;
card
->
cid
.
manfid
=
UNSTUFF_BITS
(
resp
,
104
,
24
);
cid
->
prod_name
[
7
]
=
'\0'
;
card
->
cid
.
prod_name
[
0
]
=
UNSTUFF_BITS
(
resp
,
96
,
8
);
cid
->
hwrev
=
(
resp
[
2
]
>>
12
)
&
15
;
card
->
cid
.
prod_name
[
1
]
=
UNSTUFF_BITS
(
resp
,
88
,
8
);
cid
->
fwrev
=
(
resp
[
2
]
>>
8
)
&
15
;
card
->
cid
.
prod_name
[
2
]
=
UNSTUFF_BITS
(
resp
,
80
,
8
);
cid
->
serial
=
(
resp
[
2
]
&
255
)
<<
16
|
(
resp
[
3
]
>>
16
);
card
->
cid
.
prod_name
[
3
]
=
UNSTUFF_BITS
(
resp
,
72
,
8
);
cid
->
month
=
(
resp
[
3
]
>>
12
)
&
15
;
card
->
cid
.
prod_name
[
4
]
=
UNSTUFF_BITS
(
resp
,
64
,
8
);
cid
->
year
=
(
resp
[
3
]
>>
8
)
&
15
;
card
->
cid
.
prod_name
[
5
]
=
UNSTUFF_BITS
(
resp
,
56
,
8
);
card
->
cid
.
prod_name
[
6
]
=
UNSTUFF_BITS
(
resp
,
48
,
8
);
card
->
cid
.
hwrev
=
UNSTUFF_BITS
(
resp
,
44
,
4
);
card
->
cid
.
fwrev
=
UNSTUFF_BITS
(
resp
,
40
,
4
);
card
->
cid
.
serial
=
UNSTUFF_BITS
(
resp
,
16
,
24
);
card
->
cid
.
month
=
UNSTUFF_BITS
(
resp
,
12
,
4
);
card
->
cid
.
year
=
UNSTUFF_BITS
(
resp
,
8
,
4
)
+
1997
;
break
;
case
2
:
/* MMC v2.x ? */
case
3
:
/* MMC v3.x ? */
card
->
cid
.
manfid
=
UNSTUFF_BITS
(
resp
,
120
,
8
);
card
->
cid
.
oemid
=
UNSTUFF_BITS
(
resp
,
104
,
16
);
card
->
cid
.
prod_name
[
0
]
=
UNSTUFF_BITS
(
resp
,
96
,
8
);
card
->
cid
.
prod_name
[
1
]
=
UNSTUFF_BITS
(
resp
,
88
,
8
);
card
->
cid
.
prod_name
[
2
]
=
UNSTUFF_BITS
(
resp
,
80
,
8
);
card
->
cid
.
prod_name
[
3
]
=
UNSTUFF_BITS
(
resp
,
72
,
8
);
card
->
cid
.
prod_name
[
4
]
=
UNSTUFF_BITS
(
resp
,
64
,
8
);
card
->
cid
.
prod_name
[
5
]
=
UNSTUFF_BITS
(
resp
,
56
,
8
);
card
->
cid
.
serial
=
UNSTUFF_BITS
(
resp
,
16
,
32
);
card
->
cid
.
month
=
UNSTUFF_BITS
(
resp
,
12
,
4
);
card
->
cid
.
year
=
UNSTUFF_BITS
(
resp
,
8
,
4
)
+
1997
;
break
;
default:
printk
(
"%s: card has unknown MMCA version %d
\n
"
,
card
->
host
->
host_name
,
card
->
csd
.
mmca_vsn
);
mmc_card_set_bad
(
card
);
break
;
}
}
}
/*
* Given a 128-bit response, decode to our card CSD structure.
*/
static
void
mmc_decode_csd
(
struct
mmc_card
*
card
)
static
void
mmc_decode_csd
(
struct
mmc_card
*
card
)
{
{
struct
mmc_csd
*
csd
=
&
card
->
csd
;
struct
mmc_csd
*
csd
=
&
card
->
csd
;
unsigned
int
e
,
m
;
unsigned
int
e
,
m
,
csd_struct
;
u32
*
resp
=
card
->
raw_csd
;
u32
*
resp
=
card
->
raw_csd
;
csd
->
mmc_prot
=
(
resp
[
0
]
>>
26
)
&
15
;
/*
m
=
(
resp
[
0
]
>>
19
)
&
15
;
* We only understand CSD structure v1.1 and v2.
e
=
(
resp
[
0
]
>>
16
)
&
7
;
* v2 has extra information in bits 15, 11 and 10.
*/
csd_struct
=
UNSTUFF_BITS
(
resp
,
126
,
2
);
if
(
csd_struct
!=
1
&&
csd_struct
!=
2
)
{
printk
(
"%s: unrecognised CSD structure version %d
\n
"
,
card
->
host
->
host_name
,
csd_struct
);
mmc_card_set_bad
(
card
);
return
;
}
csd
->
mmca_vsn
=
UNSTUFF_BITS
(
resp
,
122
,
4
);
m
=
UNSTUFF_BITS
(
resp
,
115
,
4
);
e
=
UNSTUFF_BITS
(
resp
,
112
,
3
);
csd
->
tacc_ns
=
(
tacc_exp
[
e
]
*
tacc_mant
[
m
]
+
9
)
/
10
;
csd
->
tacc_ns
=
(
tacc_exp
[
e
]
*
tacc_mant
[
m
]
+
9
)
/
10
;
csd
->
tacc_clks
=
((
resp
[
0
]
>>
8
)
&
255
)
*
100
;
csd
->
tacc_clks
=
UNSTUFF_BITS
(
resp
,
104
,
8
)
*
100
;
m
=
(
resp
[
0
]
>>
3
)
&
15
;
m
=
UNSTUFF_BITS
(
resp
,
99
,
4
)
;
e
=
resp
[
0
]
&
7
;
e
=
UNSTUFF_BITS
(
resp
,
96
,
3
)
;
csd
->
max_dtr
=
tran_exp
[
e
]
*
tran_mant
[
m
];
csd
->
max_dtr
=
tran_exp
[
e
]
*
tran_mant
[
m
];
csd
->
cmdclass
=
(
resp
[
1
]
>>
20
)
&
0xfff
;
csd
->
cmdclass
=
UNSTUFF_BITS
(
resp
,
84
,
12
)
;
e
=
(
resp
[
2
]
>>
15
)
&
7
;
e
=
UNSTUFF_BITS
(
resp
,
47
,
3
)
;
m
=
(
resp
[
1
]
<<
2
|
resp
[
2
]
>>
30
)
&
0x3fff
;
m
=
UNSTUFF_BITS
(
resp
,
62
,
12
)
;
csd
->
capacity
=
(
1
+
m
)
<<
(
e
+
2
);
csd
->
capacity
=
(
1
+
m
)
<<
(
e
+
2
);
csd
->
read_blkbits
=
(
resp
[
1
]
>>
16
)
&
15
;
csd
->
read_blkbits
=
UNSTUFF_BITS
(
resp
,
80
,
4
)
;
}
}
/*
/*
...
...
drivers/mmc/mmc_sysfs.c
View file @
201ee40f
...
@@ -67,8 +67,9 @@ mmc_bus_hotplug(struct device *dev, char **envp, int num_envp, char *buf,
...
@@ -67,8 +67,9 @@ mmc_bus_hotplug(struct device *dev, char **envp, int num_envp, char *buf,
i
=
0
;
i
=
0
;
add_env
(
"MMC_CCC=%s"
,
ccc
);
add_env
(
"MMC_CCC=%s"
,
ccc
);
add_env
(
"MMC_MANFID=%03x"
,
card
->
cid
.
manfid
);
add_env
(
"MMC_MANFID=%06x"
,
card
->
cid
.
manfid
);
add_env
(
"MMC_SLOT_NAME=%s"
,
card
->
dev
.
bus_id
);
add_env
(
"MMC_NAME=%s"
,
mmc_card_name
(
card
));
add_env
(
"MMC_OEMID=%04x"
,
card
->
cid
.
oemid
);
return
0
;
return
0
;
}
}
...
@@ -162,12 +163,13 @@ MMC_ATTR(cid, "%08x%08x%08x%08x\n", card->raw_cid[0], card->raw_cid[1],
...
@@ -162,12 +163,13 @@ MMC_ATTR(cid, "%08x%08x%08x%08x\n", card->raw_cid[0], card->raw_cid[1],
card
->
raw_cid
[
2
],
card
->
raw_cid
[
3
]);
card
->
raw_cid
[
2
],
card
->
raw_cid
[
3
]);
MMC_ATTR
(
csd
,
"%08x%08x%08x%08x
\n
"
,
card
->
raw_csd
[
0
],
card
->
raw_csd
[
1
],
MMC_ATTR
(
csd
,
"%08x%08x%08x%08x
\n
"
,
card
->
raw_csd
[
0
],
card
->
raw_csd
[
1
],
card
->
raw_csd
[
2
],
card
->
raw_csd
[
3
]);
card
->
raw_csd
[
2
],
card
->
raw_csd
[
3
]);
MMC_ATTR
(
date
,
"%02d/%04d
\n
"
,
card
->
cid
.
month
,
1997
+
card
->
cid
.
year
);
MMC_ATTR
(
date
,
"%02d/%04d
\n
"
,
card
->
cid
.
month
,
card
->
cid
.
year
);
MMC_ATTR
(
fwrev
,
"0x%x
\n
"
,
card
->
cid
.
fwrev
);
MMC_ATTR
(
fwrev
,
"0x%x
\n
"
,
card
->
cid
.
fwrev
);
MMC_ATTR
(
hwrev
,
"0x%x
\n
"
,
card
->
cid
.
hwrev
);
MMC_ATTR
(
hwrev
,
"0x%x
\n
"
,
card
->
cid
.
hwrev
);
MMC_ATTR
(
manfid
,
"0x%0
3
x
\n
"
,
card
->
cid
.
manfid
);
MMC_ATTR
(
manfid
,
"0x%0
6
x
\n
"
,
card
->
cid
.
manfid
);
MMC_ATTR
(
name
,
"%s
\n
"
,
card
->
cid
.
prod_name
);
MMC_ATTR
(
name
,
"%s
\n
"
,
card
->
cid
.
prod_name
);
MMC_ATTR
(
serial
,
"0x%06x
\n
"
,
card
->
cid
.
serial
);
MMC_ATTR
(
oemid
,
"0x%04x
\n
"
,
card
->
cid
.
oemid
);
MMC_ATTR
(
serial
,
"0x%08x
\n
"
,
card
->
cid
.
serial
);
static
struct
device_attribute
*
mmc_dev_attributes
[]
=
{
static
struct
device_attribute
*
mmc_dev_attributes
[]
=
{
&
dev_attr_cid
,
&
dev_attr_cid
,
...
@@ -177,6 +179,7 @@ static struct device_attribute *mmc_dev_attributes[] = {
...
@@ -177,6 +179,7 @@ static struct device_attribute *mmc_dev_attributes[] = {
&
dev_attr_hwrev
,
&
dev_attr_hwrev
,
&
dev_attr_manfid
,
&
dev_attr_manfid
,
&
dev_attr_name
,
&
dev_attr_name
,
&
dev_attr_oemid
,
&
dev_attr_serial
,
&
dev_attr_serial
,
};
};
...
...
include/linux/mmc/card.h
View file @
201ee40f
...
@@ -14,16 +14,17 @@
...
@@ -14,16 +14,17 @@
struct
mmc_cid
{
struct
mmc_cid
{
unsigned
int
manfid
;
unsigned
int
manfid
;
unsigned
int
serial
;
char
prod_name
[
8
];
char
prod_name
[
8
];
unsigned
int
serial
;
unsigned
short
oemid
;
unsigned
short
year
;
unsigned
char
hwrev
;
unsigned
char
hwrev
;
unsigned
char
fwrev
;
unsigned
char
fwrev
;
unsigned
char
month
;
unsigned
char
month
;
unsigned
char
year
;
};
};
struct
mmc_csd
{
struct
mmc_csd
{
unsigned
char
mmc
_prot
;
unsigned
char
mmc
a_vsn
;
unsigned
short
cmdclass
;
unsigned
short
cmdclass
;
unsigned
short
tacc_clks
;
unsigned
short
tacc_clks
;
unsigned
int
tacc_ns
;
unsigned
int
tacc_ns
;
...
...
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