mirror of
https://github.com/adulau/aha.git
synced 2024-12-30 20:56:23 +00:00
pcmcia: cistpl: use get_unaligned() in CIS parsing
Based on a patch by Haavard Skinnemoen posted to linux-pcmcia, but using static inlines for readability reasons. this should fix PCMCIA an AVR32 Signed-off-by: Daniel Ritz <daniel.ritz@gmx.ch> Cc: Haavard Skinnemoen <hskinnemoen@atmel.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
b5446b514c
commit
dc0cf6a263
1 changed files with 28 additions and 20 deletions
|
@ -25,6 +25,7 @@
|
||||||
#include <linux/ioport.h>
|
#include <linux/ioport.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/byteorder.h>
|
#include <asm/byteorder.h>
|
||||||
|
#include <asm/unaligned.h>
|
||||||
|
|
||||||
#include <pcmcia/cs_types.h>
|
#include <pcmcia/cs_types.h>
|
||||||
#include <pcmcia/ss.h>
|
#include <pcmcia/ss.h>
|
||||||
|
@ -401,6 +402,15 @@ EXPORT_SYMBOL(pcmcia_replace_cis);
|
||||||
|
|
||||||
======================================================================*/
|
======================================================================*/
|
||||||
|
|
||||||
|
static inline u16 cis_get_u16(void *ptr)
|
||||||
|
{
|
||||||
|
return le16_to_cpu(get_unaligned((__le16 *) ptr));
|
||||||
|
}
|
||||||
|
static inline u32 cis_get_u32(void *ptr)
|
||||||
|
{
|
||||||
|
return le32_to_cpu(get_unaligned((__le32 *) ptr));
|
||||||
|
}
|
||||||
|
|
||||||
typedef struct tuple_flags {
|
typedef struct tuple_flags {
|
||||||
u_int link_space:4;
|
u_int link_space:4;
|
||||||
u_int has_link:1;
|
u_int has_link:1;
|
||||||
|
@ -461,7 +471,7 @@ static int follow_link(struct pcmcia_socket *s, tuple_t *tuple)
|
||||||
/* Get indirect link from the MFC tuple */
|
/* Get indirect link from the MFC tuple */
|
||||||
read_cis_cache(s, LINK_SPACE(tuple->Flags),
|
read_cis_cache(s, LINK_SPACE(tuple->Flags),
|
||||||
tuple->LinkOffset, 5, link);
|
tuple->LinkOffset, 5, link);
|
||||||
ofs = le32_to_cpu(*(__le32 *)(link+1));
|
ofs = cis_get_u32(link + 1);
|
||||||
SPACE(tuple->Flags) = (link[0] == CISTPL_MFC_ATTR);
|
SPACE(tuple->Flags) = (link[0] == CISTPL_MFC_ATTR);
|
||||||
/* Move to the next indirect link */
|
/* Move to the next indirect link */
|
||||||
tuple->LinkOffset += 5;
|
tuple->LinkOffset += 5;
|
||||||
|
@ -668,10 +678,10 @@ static int parse_checksum(tuple_t *tuple, cistpl_checksum_t *csum)
|
||||||
u_char *p;
|
u_char *p;
|
||||||
if (tuple->TupleDataLen < 5)
|
if (tuple->TupleDataLen < 5)
|
||||||
return CS_BAD_TUPLE;
|
return CS_BAD_TUPLE;
|
||||||
p = (u_char *)tuple->TupleData;
|
p = (u_char *) tuple->TupleData;
|
||||||
csum->addr = tuple->CISOffset+(short)le16_to_cpu(*(__le16 *)p)-2;
|
csum->addr = tuple->CISOffset + cis_get_u16(p) - 2;
|
||||||
csum->len = le16_to_cpu(*(__le16 *)(p + 2));
|
csum->len = cis_get_u16(p + 2);
|
||||||
csum->sum = *(p+4);
|
csum->sum = *(p + 4);
|
||||||
return CS_SUCCESS;
|
return CS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -681,7 +691,7 @@ static int parse_longlink(tuple_t *tuple, cistpl_longlink_t *link)
|
||||||
{
|
{
|
||||||
if (tuple->TupleDataLen < 4)
|
if (tuple->TupleDataLen < 4)
|
||||||
return CS_BAD_TUPLE;
|
return CS_BAD_TUPLE;
|
||||||
link->addr = le32_to_cpu(*(__le32 *)tuple->TupleData);
|
link->addr = cis_get_u32(tuple->TupleData);
|
||||||
return CS_SUCCESS;
|
return CS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -700,7 +710,8 @@ static int parse_longlink_mfc(tuple_t *tuple,
|
||||||
return CS_BAD_TUPLE;
|
return CS_BAD_TUPLE;
|
||||||
for (i = 0; i < link->nfn; i++) {
|
for (i = 0; i < link->nfn; i++) {
|
||||||
link->fn[i].space = *p; p++;
|
link->fn[i].space = *p; p++;
|
||||||
link->fn[i].addr = le32_to_cpu(*(__le32 *)p); p += 4;
|
link->fn[i].addr = cis_get_u32(p);
|
||||||
|
p += 4;
|
||||||
}
|
}
|
||||||
return CS_SUCCESS;
|
return CS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -787,12 +798,10 @@ static int parse_jedec(tuple_t *tuple, cistpl_jedec_t *jedec)
|
||||||
|
|
||||||
static int parse_manfid(tuple_t *tuple, cistpl_manfid_t *m)
|
static int parse_manfid(tuple_t *tuple, cistpl_manfid_t *m)
|
||||||
{
|
{
|
||||||
__le16 *p;
|
|
||||||
if (tuple->TupleDataLen < 4)
|
if (tuple->TupleDataLen < 4)
|
||||||
return CS_BAD_TUPLE;
|
return CS_BAD_TUPLE;
|
||||||
p = (__le16 *)tuple->TupleData;
|
m->manf = cis_get_u16(tuple->TupleData);
|
||||||
m->manf = le16_to_cpu(p[0]);
|
m->card = cis_get_u16(tuple->TupleData + 2);
|
||||||
m->card = le16_to_cpu(p[1]);
|
|
||||||
return CS_SUCCESS;
|
return CS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1091,7 +1100,7 @@ static int parse_cftable_entry(tuple_t *tuple,
|
||||||
break;
|
break;
|
||||||
case 0x20:
|
case 0x20:
|
||||||
entry->mem.nwin = 1;
|
entry->mem.nwin = 1;
|
||||||
entry->mem.win[0].len = le16_to_cpu(*(__le16 *)p) << 8;
|
entry->mem.win[0].len = cis_get_u16(p) << 8;
|
||||||
entry->mem.win[0].card_addr = 0;
|
entry->mem.win[0].card_addr = 0;
|
||||||
entry->mem.win[0].host_addr = 0;
|
entry->mem.win[0].host_addr = 0;
|
||||||
p += 2;
|
p += 2;
|
||||||
|
@ -1099,9 +1108,8 @@ static int parse_cftable_entry(tuple_t *tuple,
|
||||||
break;
|
break;
|
||||||
case 0x40:
|
case 0x40:
|
||||||
entry->mem.nwin = 1;
|
entry->mem.nwin = 1;
|
||||||
entry->mem.win[0].len = le16_to_cpu(*(__le16 *)p) << 8;
|
entry->mem.win[0].len = cis_get_u16(p) << 8;
|
||||||
entry->mem.win[0].card_addr =
|
entry->mem.win[0].card_addr = cis_get_u16(p + 2) << 8;
|
||||||
le16_to_cpu(*(__le16 *)(p+2)) << 8;
|
|
||||||
entry->mem.win[0].host_addr = 0;
|
entry->mem.win[0].host_addr = 0;
|
||||||
p += 4;
|
p += 4;
|
||||||
if (p > q) return CS_BAD_TUPLE;
|
if (p > q) return CS_BAD_TUPLE;
|
||||||
|
@ -1138,7 +1146,7 @@ static int parse_bar(tuple_t *tuple, cistpl_bar_t *bar)
|
||||||
p = (u_char *)tuple->TupleData;
|
p = (u_char *)tuple->TupleData;
|
||||||
bar->attr = *p;
|
bar->attr = *p;
|
||||||
p += 2;
|
p += 2;
|
||||||
bar->size = le32_to_cpu(*(__le32 *)p);
|
bar->size = cis_get_u32(p);
|
||||||
return CS_SUCCESS;
|
return CS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1151,7 +1159,7 @@ static int parse_config_cb(tuple_t *tuple, cistpl_config_t *config)
|
||||||
return CS_BAD_TUPLE;
|
return CS_BAD_TUPLE;
|
||||||
config->last_idx = *(++p);
|
config->last_idx = *(++p);
|
||||||
p++;
|
p++;
|
||||||
config->base = le32_to_cpu(*(__le32 *)p);
|
config->base = cis_get_u32(p);
|
||||||
config->subtuples = tuple->TupleDataLen - 6;
|
config->subtuples = tuple->TupleDataLen - 6;
|
||||||
return CS_SUCCESS;
|
return CS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -1267,7 +1275,7 @@ static int parse_vers_2(tuple_t *tuple, cistpl_vers_2_t *v2)
|
||||||
|
|
||||||
v2->vers = p[0];
|
v2->vers = p[0];
|
||||||
v2->comply = p[1];
|
v2->comply = p[1];
|
||||||
v2->dindex = le16_to_cpu(*(__le16 *)(p+2));
|
v2->dindex = cis_get_u16(p +2 );
|
||||||
v2->vspec8 = p[6];
|
v2->vspec8 = p[6];
|
||||||
v2->vspec9 = p[7];
|
v2->vspec9 = p[7];
|
||||||
v2->nhdr = p[8];
|
v2->nhdr = p[8];
|
||||||
|
@ -1308,8 +1316,8 @@ static int parse_format(tuple_t *tuple, cistpl_format_t *fmt)
|
||||||
|
|
||||||
fmt->type = p[0];
|
fmt->type = p[0];
|
||||||
fmt->edc = p[1];
|
fmt->edc = p[1];
|
||||||
fmt->offset = le32_to_cpu(*(__le32 *)(p+2));
|
fmt->offset = cis_get_u32(p + 2);
|
||||||
fmt->length = le32_to_cpu(*(__le32 *)(p+6));
|
fmt->length = cis_get_u32(p + 6);
|
||||||
|
|
||||||
return CS_SUCCESS;
|
return CS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue