mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 03:36:19 +00:00
pcmcia: CodingStyle fixes
Fix several CodingStyle issues in drivers/pcmcia/ . checkpatch.pl no longer reports errors in the PCMCIA core. The remaining warnings mostly relate to wrong indent -- PCMCIA historically used 4 spaces --, to lines over 80 characters and to hundreds of typedefs. The cleanup of those will follow in the future. Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
This commit is contained in:
parent
e15c1c1f3f
commit
9fea84f46a
14 changed files with 481 additions and 383 deletions
|
@ -27,8 +27,8 @@
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <linux/ioport.h>
|
#include <linux/ioport.h>
|
||||||
|
#include <linux/io.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
#include <asm/io.h>
|
|
||||||
|
|
||||||
#include <pcmcia/cs_types.h>
|
#include <pcmcia/cs_types.h>
|
||||||
#include <pcmcia/ss.h>
|
#include <pcmcia/ss.h>
|
||||||
|
@ -88,7 +88,7 @@ static u_int xlate_rom_addr(void __iomem *b, u_int addr)
|
||||||
|
|
||||||
=====================================================================*/
|
=====================================================================*/
|
||||||
|
|
||||||
static void cb_release_cis_mem(struct pcmcia_socket * s)
|
static void cb_release_cis_mem(struct pcmcia_socket *s)
|
||||||
{
|
{
|
||||||
if (s->cb_cis_virt) {
|
if (s->cb_cis_virt) {
|
||||||
dev_dbg(&s->dev, "cb_release_cis_mem()\n");
|
dev_dbg(&s->dev, "cb_release_cis_mem()\n");
|
||||||
|
@ -98,7 +98,7 @@ static void cb_release_cis_mem(struct pcmcia_socket * s)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cb_setup_cis_mem(struct pcmcia_socket * s, struct resource *res)
|
static int cb_setup_cis_mem(struct pcmcia_socket *s, struct resource *res)
|
||||||
{
|
{
|
||||||
unsigned int start, size;
|
unsigned int start, size;
|
||||||
|
|
||||||
|
@ -127,7 +127,8 @@ static int cb_setup_cis_mem(struct pcmcia_socket * s, struct resource *res)
|
||||||
|
|
||||||
=====================================================================*/
|
=====================================================================*/
|
||||||
|
|
||||||
int read_cb_mem(struct pcmcia_socket * s, int space, u_int addr, u_int len, void *ptr)
|
int read_cb_mem(struct pcmcia_socket *s, int space, u_int addr, u_int len,
|
||||||
|
void *ptr)
|
||||||
{
|
{
|
||||||
struct pci_dev *dev;
|
struct pci_dev *dev;
|
||||||
struct resource *res;
|
struct resource *res;
|
||||||
|
@ -207,14 +208,14 @@ static void cardbus_assign_irqs(struct pci_bus *bus, int irq)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int __ref cb_alloc(struct pcmcia_socket * s)
|
int __ref cb_alloc(struct pcmcia_socket *s)
|
||||||
{
|
{
|
||||||
struct pci_bus *bus = s->cb_dev->subordinate;
|
struct pci_bus *bus = s->cb_dev->subordinate;
|
||||||
struct pci_dev *dev;
|
struct pci_dev *dev;
|
||||||
unsigned int max, pass;
|
unsigned int max, pass;
|
||||||
|
|
||||||
s->functions = pci_scan_slot(bus, PCI_DEVFN(0, 0));
|
s->functions = pci_scan_slot(bus, PCI_DEVFN(0, 0));
|
||||||
// pcibios_fixup_bus(bus);
|
/* pcibios_fixup_bus(bus); */
|
||||||
|
|
||||||
max = bus->secondary;
|
max = bus->secondary;
|
||||||
for (pass = 0; pass < 2; pass++)
|
for (pass = 0; pass < 2; pass++)
|
||||||
|
@ -241,7 +242,7 @@ int __ref cb_alloc(struct pcmcia_socket * s)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void cb_free(struct pcmcia_socket * s)
|
void cb_free(struct pcmcia_socket *s)
|
||||||
{
|
{
|
||||||
struct pci_dev *bridge = s->cb_dev;
|
struct pci_dev *bridge = s->cb_dev;
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <linux/ioport.h>
|
#include <linux/ioport.h>
|
||||||
#include <asm/io.h>
|
#include <linux/io.h>
|
||||||
#include <asm/byteorder.h>
|
#include <asm/byteorder.h>
|
||||||
#include <asm/unaligned.h>
|
#include <asm/unaligned.h>
|
||||||
|
|
||||||
|
@ -421,8 +421,6 @@ typedef struct tuple_flags {
|
||||||
#define MFC_FN(f) (((tuple_flags *)(&(f)))->mfc_fn)
|
#define MFC_FN(f) (((tuple_flags *)(&(f)))->mfc_fn)
|
||||||
#define SPACE(f) (((tuple_flags *)(&(f)))->space)
|
#define SPACE(f) (((tuple_flags *)(&(f)))->space)
|
||||||
|
|
||||||
int pccard_get_next_tuple(struct pcmcia_socket *s, unsigned int func, tuple_t *tuple);
|
|
||||||
|
|
||||||
int pccard_get_first_tuple(struct pcmcia_socket *s, unsigned int function, tuple_t *tuple)
|
int pccard_get_first_tuple(struct pcmcia_socket *s, unsigned int function, tuple_t *tuple)
|
||||||
{
|
{
|
||||||
if (!s)
|
if (!s)
|
||||||
|
@ -526,7 +524,8 @@ int pccard_get_next_tuple(struct pcmcia_socket *s, unsigned int function, tuple_
|
||||||
|
|
||||||
/* End of chain? Follow long link if possible */
|
/* End of chain? Follow long link if possible */
|
||||||
if (link[0] == CISTPL_END) {
|
if (link[0] == CISTPL_END) {
|
||||||
if ((ofs = follow_link(s, tuple)) < 0)
|
ofs = follow_link(s, tuple);
|
||||||
|
if (ofs < 0)
|
||||||
return -ENOSPC;
|
return -ENOSPC;
|
||||||
attr = SPACE(tuple->Flags);
|
attr = SPACE(tuple->Flags);
|
||||||
read_cis_cache(s, attr, ofs, 2, link);
|
read_cis_cache(s, attr, ofs, 2, link);
|
||||||
|
@ -638,25 +637,36 @@ static int parse_device(tuple_t *tuple, cistpl_device_t *device)
|
||||||
device->ndev = 0;
|
device->ndev = 0;
|
||||||
for (i = 0; i < CISTPL_MAX_DEVICES; i++) {
|
for (i = 0; i < CISTPL_MAX_DEVICES; i++) {
|
||||||
|
|
||||||
if (*p == 0xff) break;
|
if (*p == 0xff)
|
||||||
|
break;
|
||||||
device->dev[i].type = (*p >> 4);
|
device->dev[i].type = (*p >> 4);
|
||||||
device->dev[i].wp = (*p & 0x08) ? 1 : 0;
|
device->dev[i].wp = (*p & 0x08) ? 1 : 0;
|
||||||
switch (*p & 0x07) {
|
switch (*p & 0x07) {
|
||||||
case 0: device->dev[i].speed = 0; break;
|
case 0:
|
||||||
case 1: device->dev[i].speed = 250; break;
|
device->dev[i].speed = 0;
|
||||||
case 2: device->dev[i].speed = 200; break;
|
break;
|
||||||
case 3: device->dev[i].speed = 150; break;
|
case 1:
|
||||||
case 4: device->dev[i].speed = 100; break;
|
device->dev[i].speed = 250;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
device->dev[i].speed = 200;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
device->dev[i].speed = 150;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
device->dev[i].speed = 100;
|
||||||
|
break;
|
||||||
case 7:
|
case 7:
|
||||||
if (++p == q)
|
|
||||||
return -EINVAL;
|
|
||||||
device->dev[i].speed = SPEED_CVT(*p);
|
|
||||||
while (*p & 0x80)
|
|
||||||
if (++p == q)
|
if (++p == q)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
break;
|
device->dev[i].speed = SPEED_CVT(*p);
|
||||||
|
while (*p & 0x80)
|
||||||
|
if (++p == q)
|
||||||
|
return -EINVAL;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (++p == q)
|
if (++p == q)
|
||||||
|
@ -737,11 +747,13 @@ static int parse_strings(u_char *p, u_char *q, int max,
|
||||||
ns++;
|
ns++;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
s[j++] = (*p == 0xff) ? '\0' : *p;
|
s[j++] = (*p == 0xff) ? '\0' : *p;
|
||||||
if ((*p == '\0') || (*p == 0xff)) break;
|
if ((*p == '\0') || (*p == 0xff))
|
||||||
|
break;
|
||||||
if (++p == q)
|
if (++p == q)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
if ((*p == 0xff) || (++p == q)) break;
|
if ((*p == 0xff) || (++p == q))
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
if (found) {
|
if (found) {
|
||||||
*found = ns;
|
*found = ns;
|
||||||
|
@ -793,7 +805,8 @@ static int parse_jedec(tuple_t *tuple, cistpl_jedec_t *jedec)
|
||||||
q = p + tuple->TupleDataLen;
|
q = p + tuple->TupleDataLen;
|
||||||
|
|
||||||
for (nid = 0; nid < CISTPL_MAX_DEVICES; nid++) {
|
for (nid = 0; nid < CISTPL_MAX_DEVICES; nid++) {
|
||||||
if (p > q-2) break;
|
if (p > q-2)
|
||||||
|
break;
|
||||||
jedec->id[nid].mfr = p[0];
|
jedec->id[nid].mfr = p[0];
|
||||||
jedec->id[nid].info = p[1];
|
jedec->id[nid].info = p[1];
|
||||||
p += 2;
|
p += 2;
|
||||||
|
@ -880,17 +893,20 @@ static u_char *parse_power(u_char *p, u_char *q,
|
||||||
int i;
|
int i;
|
||||||
u_int scale;
|
u_int scale;
|
||||||
|
|
||||||
if (p == q) return NULL;
|
if (p == q)
|
||||||
|
return NULL;
|
||||||
pwr->present = *p;
|
pwr->present = *p;
|
||||||
pwr->flags = 0;
|
pwr->flags = 0;
|
||||||
p++;
|
p++;
|
||||||
for (i = 0; i < 7; i++)
|
for (i = 0; i < 7; i++)
|
||||||
if (pwr->present & (1<<i)) {
|
if (pwr->present & (1<<i)) {
|
||||||
if (p == q) return NULL;
|
if (p == q)
|
||||||
|
return NULL;
|
||||||
pwr->param[i] = POWER_CVT(*p);
|
pwr->param[i] = POWER_CVT(*p);
|
||||||
scale = POWER_SCALE(*p);
|
scale = POWER_SCALE(*p);
|
||||||
while (*p & 0x80) {
|
while (*p & 0x80) {
|
||||||
if (++p == q) return NULL;
|
if (++p == q)
|
||||||
|
return NULL;
|
||||||
if ((*p & 0x7f) < 100)
|
if ((*p & 0x7f) < 100)
|
||||||
pwr->param[i] += (*p & 0x7f) * scale / 100;
|
pwr->param[i] += (*p & 0x7f) * scale / 100;
|
||||||
else if (*p == 0x7d)
|
else if (*p == 0x7d)
|
||||||
|
@ -914,24 +930,28 @@ static u_char *parse_timing(u_char *p, u_char *q,
|
||||||
{
|
{
|
||||||
u_char scale;
|
u_char scale;
|
||||||
|
|
||||||
if (p == q) return NULL;
|
if (p == q)
|
||||||
|
return NULL;
|
||||||
scale = *p;
|
scale = *p;
|
||||||
if ((scale & 3) != 3) {
|
if ((scale & 3) != 3) {
|
||||||
if (++p == q) return NULL;
|
if (++p == q)
|
||||||
|
return NULL;
|
||||||
timing->wait = SPEED_CVT(*p);
|
timing->wait = SPEED_CVT(*p);
|
||||||
timing->waitscale = exponent[scale & 3];
|
timing->waitscale = exponent[scale & 3];
|
||||||
} else
|
} else
|
||||||
timing->wait = 0;
|
timing->wait = 0;
|
||||||
scale >>= 2;
|
scale >>= 2;
|
||||||
if ((scale & 7) != 7) {
|
if ((scale & 7) != 7) {
|
||||||
if (++p == q) return NULL;
|
if (++p == q)
|
||||||
|
return NULL;
|
||||||
timing->ready = SPEED_CVT(*p);
|
timing->ready = SPEED_CVT(*p);
|
||||||
timing->rdyscale = exponent[scale & 7];
|
timing->rdyscale = exponent[scale & 7];
|
||||||
} else
|
} else
|
||||||
timing->ready = 0;
|
timing->ready = 0;
|
||||||
scale >>= 3;
|
scale >>= 3;
|
||||||
if (scale != 7) {
|
if (scale != 7) {
|
||||||
if (++p == q) return NULL;
|
if (++p == q)
|
||||||
|
return NULL;
|
||||||
timing->reserved = SPEED_CVT(*p);
|
timing->reserved = SPEED_CVT(*p);
|
||||||
timing->rsvscale = exponent[scale];
|
timing->rsvscale = exponent[scale];
|
||||||
} else
|
} else
|
||||||
|
@ -946,7 +966,8 @@ static u_char *parse_io(u_char *p, u_char *q, cistpl_io_t *io)
|
||||||
{
|
{
|
||||||
int i, j, bsz, lsz;
|
int i, j, bsz, lsz;
|
||||||
|
|
||||||
if (p == q) return NULL;
|
if (p == q)
|
||||||
|
return NULL;
|
||||||
io->flags = *p;
|
io->flags = *p;
|
||||||
|
|
||||||
if (!(*p & 0x80)) {
|
if (!(*p & 0x80)) {
|
||||||
|
@ -956,23 +977,28 @@ static u_char *parse_io(u_char *p, u_char *q, cistpl_io_t *io)
|
||||||
return p+1;
|
return p+1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (++p == q) return NULL;
|
if (++p == q)
|
||||||
|
return NULL;
|
||||||
io->nwin = (*p & 0x0f) + 1;
|
io->nwin = (*p & 0x0f) + 1;
|
||||||
bsz = (*p & 0x30) >> 4;
|
bsz = (*p & 0x30) >> 4;
|
||||||
if (bsz == 3) bsz++;
|
if (bsz == 3)
|
||||||
|
bsz++;
|
||||||
lsz = (*p & 0xc0) >> 6;
|
lsz = (*p & 0xc0) >> 6;
|
||||||
if (lsz == 3) lsz++;
|
if (lsz == 3)
|
||||||
|
lsz++;
|
||||||
p++;
|
p++;
|
||||||
|
|
||||||
for (i = 0; i < io->nwin; i++) {
|
for (i = 0; i < io->nwin; i++) {
|
||||||
io->win[i].base = 0;
|
io->win[i].base = 0;
|
||||||
io->win[i].len = 1;
|
io->win[i].len = 1;
|
||||||
for (j = 0; j < bsz; j++, p++) {
|
for (j = 0; j < bsz; j++, p++) {
|
||||||
if (p == q) return NULL;
|
if (p == q)
|
||||||
|
return NULL;
|
||||||
io->win[i].base += *p << (j*8);
|
io->win[i].base += *p << (j*8);
|
||||||
}
|
}
|
||||||
for (j = 0; j < lsz; j++, p++) {
|
for (j = 0; j < lsz; j++, p++) {
|
||||||
if (p == q) return NULL;
|
if (p == q)
|
||||||
|
return NULL;
|
||||||
io->win[i].len += *p << (j*8);
|
io->win[i].len += *p << (j*8);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -986,27 +1012,32 @@ static u_char *parse_mem(u_char *p, u_char *q, cistpl_mem_t *mem)
|
||||||
int i, j, asz, lsz, has_ha;
|
int i, j, asz, lsz, has_ha;
|
||||||
u_int len, ca, ha;
|
u_int len, ca, ha;
|
||||||
|
|
||||||
if (p == q) return NULL;
|
if (p == q)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
mem->nwin = (*p & 0x07) + 1;
|
mem->nwin = (*p & 0x07) + 1;
|
||||||
lsz = (*p & 0x18) >> 3;
|
lsz = (*p & 0x18) >> 3;
|
||||||
asz = (*p & 0x60) >> 5;
|
asz = (*p & 0x60) >> 5;
|
||||||
has_ha = (*p & 0x80);
|
has_ha = (*p & 0x80);
|
||||||
if (++p == q) return NULL;
|
if (++p == q)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
for (i = 0; i < mem->nwin; i++) {
|
for (i = 0; i < mem->nwin; i++) {
|
||||||
len = ca = ha = 0;
|
len = ca = ha = 0;
|
||||||
for (j = 0; j < lsz; j++, p++) {
|
for (j = 0; j < lsz; j++, p++) {
|
||||||
if (p == q) return NULL;
|
if (p == q)
|
||||||
|
return NULL;
|
||||||
len += *p << (j*8);
|
len += *p << (j*8);
|
||||||
}
|
}
|
||||||
for (j = 0; j < asz; j++, p++) {
|
for (j = 0; j < asz; j++, p++) {
|
||||||
if (p == q) return NULL;
|
if (p == q)
|
||||||
|
return NULL;
|
||||||
ca += *p << (j*8);
|
ca += *p << (j*8);
|
||||||
}
|
}
|
||||||
if (has_ha)
|
if (has_ha)
|
||||||
for (j = 0; j < asz; j++, p++) {
|
for (j = 0; j < asz; j++, p++) {
|
||||||
if (p == q) return NULL;
|
if (p == q)
|
||||||
|
return NULL;
|
||||||
ha += *p << (j*8);
|
ha += *p << (j*8);
|
||||||
}
|
}
|
||||||
mem->win[i].len = len << 8;
|
mem->win[i].len = len << 8;
|
||||||
|
@ -1281,7 +1312,8 @@ static int parse_device_geo(tuple_t *tuple, cistpl_device_geo_t *geo)
|
||||||
q = p + tuple->TupleDataLen;
|
q = p + tuple->TupleDataLen;
|
||||||
|
|
||||||
for (n = 0; n < CISTPL_MAX_DEVICES; n++) {
|
for (n = 0; n < CISTPL_MAX_DEVICES; n++) {
|
||||||
if (p > q-6) break;
|
if (p > q-6)
|
||||||
|
break;
|
||||||
geo->geo[n].buswidth = p[0];
|
geo->geo[n].buswidth = p[0];
|
||||||
geo->geo[n].erase_block = 1 << (p[1]-1);
|
geo->geo[n].erase_block = 1 << (p[1]-1);
|
||||||
geo->geo[n].read_block = 1 << (p[2]-1);
|
geo->geo[n].read_block = 1 << (p[2]-1);
|
||||||
|
@ -1308,7 +1340,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 = get_unaligned_le16(p +2 );
|
v2->dindex = get_unaligned_le16(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];
|
||||||
|
@ -1332,7 +1364,8 @@ static int parse_org(tuple_t *tuple, cistpl_org_t *org)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
for (i = 0; i < 30; i++) {
|
for (i = 0; i < 30; i++) {
|
||||||
org->desc[i] = *p;
|
org->desc[i] = *p;
|
||||||
if (*p == '\0') break;
|
if (*p == '\0')
|
||||||
|
break;
|
||||||
if (++p == q)
|
if (++p == q)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -135,7 +135,7 @@ int pcmcia_socket_dev_resume(struct device *dev)
|
||||||
EXPORT_SYMBOL(pcmcia_socket_dev_resume);
|
EXPORT_SYMBOL(pcmcia_socket_dev_resume);
|
||||||
|
|
||||||
|
|
||||||
struct pcmcia_socket * pcmcia_get_socket(struct pcmcia_socket *skt)
|
struct pcmcia_socket *pcmcia_get_socket(struct pcmcia_socket *skt)
|
||||||
{
|
{
|
||||||
struct device *dev = get_device(&skt->dev);
|
struct device *dev = get_device(&skt->dev);
|
||||||
if (!dev)
|
if (!dev)
|
||||||
|
@ -145,7 +145,7 @@ struct pcmcia_socket * pcmcia_get_socket(struct pcmcia_socket *skt)
|
||||||
put_device(&skt->dev);
|
put_device(&skt->dev);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return (skt);
|
return skt;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(pcmcia_get_socket);
|
EXPORT_SYMBOL(pcmcia_get_socket);
|
||||||
|
|
||||||
|
@ -297,7 +297,7 @@ void pcmcia_unregister_socket(struct pcmcia_socket *socket)
|
||||||
EXPORT_SYMBOL(pcmcia_unregister_socket);
|
EXPORT_SYMBOL(pcmcia_unregister_socket);
|
||||||
|
|
||||||
|
|
||||||
struct pcmcia_socket * pcmcia_get_socket_by_nr(unsigned int nr)
|
struct pcmcia_socket *pcmcia_get_socket_by_nr(unsigned int nr)
|
||||||
{
|
{
|
||||||
struct pcmcia_socket *s;
|
struct pcmcia_socket *s;
|
||||||
|
|
||||||
|
@ -736,7 +736,7 @@ EXPORT_SYMBOL(pcmcia_parse_events);
|
||||||
/* register pcmcia_callback */
|
/* register pcmcia_callback */
|
||||||
int pccard_register_pcmcia(struct pcmcia_socket *s, struct pcmcia_callback *c)
|
int pccard_register_pcmcia(struct pcmcia_socket *s, struct pcmcia_callback *c)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
/* s->skt_mutex also protects s->callback */
|
/* s->skt_mutex also protects s->callback */
|
||||||
mutex_lock(&s->skt_mutex);
|
mutex_lock(&s->skt_mutex);
|
||||||
|
|
|
@ -57,7 +57,7 @@ static void pcmcia_check_driver(struct pcmcia_driver *p_drv)
|
||||||
"function\n", p_drv->drv.name);
|
"function\n", p_drv->drv.name);
|
||||||
|
|
||||||
while (did && did->match_flags) {
|
while (did && did->match_flags) {
|
||||||
for (i=0; i<4; i++) {
|
for (i = 0; i < 4; i++) {
|
||||||
if (!did->prod_id[i])
|
if (!did->prod_id[i])
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -105,7 +105,7 @@ pcmcia_store_new_id(struct device_driver *driver, const char *buf, size_t count)
|
||||||
__u16 match_flags, manf_id, card_id;
|
__u16 match_flags, manf_id, card_id;
|
||||||
__u8 func_id, function, device_no;
|
__u8 func_id, function, device_no;
|
||||||
__u32 prod_id_hash[4] = {0, 0, 0, 0};
|
__u32 prod_id_hash[4] = {0, 0, 0, 0};
|
||||||
int fields=0;
|
int fields = 0;
|
||||||
int retval = 0;
|
int retval = 0;
|
||||||
|
|
||||||
fields = sscanf(buf, "%hx %hx %hx %hhx %hhx %hhx %x %x %x %x",
|
fields = sscanf(buf, "%hx %hx %hx %hhx %hhx %hhx %x %x %x %x",
|
||||||
|
@ -214,7 +214,7 @@ EXPORT_SYMBOL(pcmcia_unregister_driver);
|
||||||
|
|
||||||
/* pcmcia_device handling */
|
/* pcmcia_device handling */
|
||||||
|
|
||||||
struct pcmcia_device * pcmcia_get_dev(struct pcmcia_device *p_dev)
|
struct pcmcia_device *pcmcia_get_dev(struct pcmcia_device *p_dev)
|
||||||
{
|
{
|
||||||
struct device *tmp_dev;
|
struct device *tmp_dev;
|
||||||
tmp_dev = get_device(&p_dev->dev);
|
tmp_dev = get_device(&p_dev->dev);
|
||||||
|
@ -258,7 +258,7 @@ static void pcmcia_add_device_later(struct pcmcia_socket *s, int mfc)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pcmcia_device_probe(struct device * dev)
|
static int pcmcia_device_probe(struct device *dev)
|
||||||
{
|
{
|
||||||
struct pcmcia_device *p_dev;
|
struct pcmcia_device *p_dev;
|
||||||
struct pcmcia_driver *p_drv;
|
struct pcmcia_driver *p_drv;
|
||||||
|
@ -325,7 +325,7 @@ put_module:
|
||||||
put_dev:
|
put_dev:
|
||||||
if (ret)
|
if (ret)
|
||||||
put_device(dev);
|
put_device(dev);
|
||||||
return (ret);
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -354,7 +354,7 @@ static void pcmcia_card_remove(struct pcmcia_socket *s, struct pcmcia_device *le
|
||||||
|
|
||||||
spin_lock_irqsave(&pcmcia_dev_list_lock, flags);
|
spin_lock_irqsave(&pcmcia_dev_list_lock, flags);
|
||||||
list_del(&p_dev->socket_device_list);
|
list_del(&p_dev->socket_device_list);
|
||||||
p_dev->_removed=1;
|
p_dev->_removed = 1;
|
||||||
spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
|
spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
|
||||||
|
|
||||||
dev_dbg(&p_dev->dev, "unregistering device\n");
|
dev_dbg(&p_dev->dev, "unregistering device\n");
|
||||||
|
@ -364,7 +364,7 @@ static void pcmcia_card_remove(struct pcmcia_socket *s, struct pcmcia_device *le
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pcmcia_device_remove(struct device * dev)
|
static int pcmcia_device_remove(struct device *dev)
|
||||||
{
|
{
|
||||||
struct pcmcia_device *p_dev;
|
struct pcmcia_device *p_dev;
|
||||||
struct pcmcia_driver *p_drv;
|
struct pcmcia_driver *p_drv;
|
||||||
|
@ -391,7 +391,7 @@ static int pcmcia_device_remove(struct device * dev)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (p_drv->remove)
|
if (p_drv->remove)
|
||||||
p_drv->remove(p_dev);
|
p_drv->remove(p_dev);
|
||||||
|
|
||||||
p_dev->dev_node = NULL;
|
p_dev->dev_node = NULL;
|
||||||
|
|
||||||
|
@ -499,7 +499,7 @@ static int pcmcia_device_query(struct pcmcia_device *p_dev)
|
||||||
*/
|
*/
|
||||||
static DEFINE_MUTEX(device_add_lock);
|
static DEFINE_MUTEX(device_add_lock);
|
||||||
|
|
||||||
struct pcmcia_device * pcmcia_device_add(struct pcmcia_socket *s, unsigned int function)
|
struct pcmcia_device *pcmcia_device_add(struct pcmcia_socket *s, unsigned int function)
|
||||||
{
|
{
|
||||||
struct pcmcia_device *p_dev, *tmp_dev;
|
struct pcmcia_device *p_dev, *tmp_dev;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
@ -545,8 +545,8 @@ struct pcmcia_device * pcmcia_device_add(struct pcmcia_socket *s, unsigned int f
|
||||||
* Note that this is serialized by the device_add_lock, so that
|
* Note that this is serialized by the device_add_lock, so that
|
||||||
* only one such struct will be created.
|
* only one such struct will be created.
|
||||||
*/
|
*/
|
||||||
list_for_each_entry(tmp_dev, &s->devices_list, socket_device_list)
|
list_for_each_entry(tmp_dev, &s->devices_list, socket_device_list)
|
||||||
if (p_dev->func == tmp_dev->func) {
|
if (p_dev->func == tmp_dev->func) {
|
||||||
p_dev->function_config = tmp_dev->function_config;
|
p_dev->function_config = tmp_dev->function_config;
|
||||||
p_dev->io = tmp_dev->io;
|
p_dev->io = tmp_dev->io;
|
||||||
p_dev->irq = tmp_dev->irq;
|
p_dev->irq = tmp_dev->irq;
|
||||||
|
@ -627,10 +627,10 @@ static int pcmcia_card_add(struct pcmcia_socket *s)
|
||||||
no_funcs = 1;
|
no_funcs = 1;
|
||||||
s->functions = no_funcs;
|
s->functions = no_funcs;
|
||||||
|
|
||||||
for (i=0; i < no_funcs; i++)
|
for (i = 0; i < no_funcs; i++)
|
||||||
pcmcia_device_add(s, i);
|
pcmcia_device_add(s, i);
|
||||||
|
|
||||||
return (ret);
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -756,7 +756,7 @@ static int pcmcia_load_firmware(struct pcmcia_device *dev, char * filename)
|
||||||
release:
|
release:
|
||||||
release_firmware(fw);
|
release_firmware(fw);
|
||||||
|
|
||||||
return (ret);
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else /* !CONFIG_PCMCIA_LOAD_CIS */
|
#else /* !CONFIG_PCMCIA_LOAD_CIS */
|
||||||
|
@ -852,7 +852,7 @@ static inline int pcmcia_devmatch(struct pcmcia_device *dev,
|
||||||
|
|
||||||
if (did->match_flags & PCMCIA_DEV_ID_MATCH_ANONYMOUS) {
|
if (did->match_flags & PCMCIA_DEV_ID_MATCH_ANONYMOUS) {
|
||||||
int i;
|
int i;
|
||||||
for (i=0; i<4; i++)
|
for (i = 0; i < 4; i++)
|
||||||
if (dev->prod_id[i])
|
if (dev->prod_id[i])
|
||||||
return 0;
|
return 0;
|
||||||
if (dev->has_manf_id || dev->has_card_id || dev->has_func_id)
|
if (dev->has_manf_id || dev->has_card_id || dev->has_func_id)
|
||||||
|
@ -865,9 +865,10 @@ static inline int pcmcia_devmatch(struct pcmcia_device *dev,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int pcmcia_bus_match(struct device * dev, struct device_driver * drv) {
|
static int pcmcia_bus_match(struct device *dev, struct device_driver *drv)
|
||||||
struct pcmcia_device * p_dev = to_pcmcia_dev(dev);
|
{
|
||||||
struct pcmcia_driver * p_drv = to_pcmcia_drv(drv);
|
struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
|
||||||
|
struct pcmcia_driver *p_drv = to_pcmcia_drv(drv);
|
||||||
struct pcmcia_device_id *did = p_drv->id_table;
|
struct pcmcia_device_id *did = p_drv->id_table;
|
||||||
struct pcmcia_dynid *dynid;
|
struct pcmcia_dynid *dynid;
|
||||||
|
|
||||||
|
@ -917,7 +918,7 @@ static int pcmcia_bus_uevent(struct device *dev, struct kobj_uevent_env *env)
|
||||||
p_dev = to_pcmcia_dev(dev);
|
p_dev = to_pcmcia_dev(dev);
|
||||||
|
|
||||||
/* calculate hashes */
|
/* calculate hashes */
|
||||||
for (i=0; i<4; i++) {
|
for (i = 0; i < 4; i++) {
|
||||||
if (!p_dev->prod_id[i])
|
if (!p_dev->prod_id[i])
|
||||||
continue;
|
continue;
|
||||||
hash[i] = crc32(0, p_dev->prod_id[i], strlen(p_dev->prod_id[i]));
|
hash[i] = crc32(0, p_dev->prod_id[i], strlen(p_dev->prod_id[i]));
|
||||||
|
@ -984,14 +985,14 @@ static void runtime_resume(struct device *dev)
|
||||||
static ssize_t field##_show (struct device *dev, struct device_attribute *attr, char *buf) \
|
static ssize_t field##_show (struct device *dev, struct device_attribute *attr, char *buf) \
|
||||||
{ \
|
{ \
|
||||||
struct pcmcia_device *p_dev = to_pcmcia_dev(dev); \
|
struct pcmcia_device *p_dev = to_pcmcia_dev(dev); \
|
||||||
return p_dev->test ? sprintf (buf, format, p_dev->field) : -ENODEV; \
|
return p_dev->test ? sprintf(buf, format, p_dev->field) : -ENODEV; \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define pcmcia_device_stringattr(name, field) \
|
#define pcmcia_device_stringattr(name, field) \
|
||||||
static ssize_t name##_show (struct device *dev, struct device_attribute *attr, char *buf) \
|
static ssize_t name##_show (struct device *dev, struct device_attribute *attr, char *buf) \
|
||||||
{ \
|
{ \
|
||||||
struct pcmcia_device *p_dev = to_pcmcia_dev(dev); \
|
struct pcmcia_device *p_dev = to_pcmcia_dev(dev); \
|
||||||
return p_dev->field ? sprintf (buf, "%s\n", p_dev->field) : -ENODEV; \
|
return p_dev->field ? sprintf(buf, "%s\n", p_dev->field) : -ENODEV; \
|
||||||
}
|
}
|
||||||
|
|
||||||
pcmcia_device_attr(func, socket, "0x%02x\n");
|
pcmcia_device_attr(func, socket, "0x%02x\n");
|
||||||
|
@ -1020,8 +1021,8 @@ static ssize_t pcmcia_store_pm_state(struct device *dev, struct device_attribute
|
||||||
struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
|
struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
if (!count)
|
if (!count)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if ((!p_dev->suspended) && !strncmp(buf, "off", 3))
|
if ((!p_dev->suspended) && !strncmp(buf, "off", 3))
|
||||||
ret = runtime_suspend(dev);
|
ret = runtime_suspend(dev);
|
||||||
|
@ -1039,10 +1040,11 @@ static ssize_t modalias_show(struct device *dev, struct device_attribute *attr,
|
||||||
u32 hash[4] = { 0, 0, 0, 0};
|
u32 hash[4] = { 0, 0, 0, 0};
|
||||||
|
|
||||||
/* calculate hashes */
|
/* calculate hashes */
|
||||||
for (i=0; i<4; i++) {
|
for (i = 0; i < 4; i++) {
|
||||||
if (!p_dev->prod_id[i])
|
if (!p_dev->prod_id[i])
|
||||||
continue;
|
continue;
|
||||||
hash[i] = crc32(0,p_dev->prod_id[i],strlen(p_dev->prod_id[i]));
|
hash[i] = crc32(0, p_dev->prod_id[i],
|
||||||
|
strlen(p_dev->prod_id[i]));
|
||||||
}
|
}
|
||||||
return sprintf(buf, "pcmcia:m%04Xc%04Xf%02Xfn%02Xpfn%02X"
|
return sprintf(buf, "pcmcia:m%04Xc%04Xf%02Xfn%02Xpfn%02X"
|
||||||
"pa%08Xpb%08Xpc%08Xpd%08X\n",
|
"pa%08Xpb%08Xpc%08Xpd%08X\n",
|
||||||
|
@ -1091,7 +1093,7 @@ static struct device_attribute pcmcia_dev_attrs[] = {
|
||||||
|
|
||||||
/* PM support, also needed for reset */
|
/* PM support, also needed for reset */
|
||||||
|
|
||||||
static int pcmcia_dev_suspend(struct device * dev, pm_message_t state)
|
static int pcmcia_dev_suspend(struct device *dev, pm_message_t state)
|
||||||
{
|
{
|
||||||
struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
|
struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
|
||||||
struct pcmcia_driver *p_drv = NULL;
|
struct pcmcia_driver *p_drv = NULL;
|
||||||
|
@ -1131,10 +1133,10 @@ static int pcmcia_dev_suspend(struct device * dev, pm_message_t state)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int pcmcia_dev_resume(struct device * dev)
|
static int pcmcia_dev_resume(struct device *dev)
|
||||||
{
|
{
|
||||||
struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
|
struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
|
||||||
struct pcmcia_driver *p_drv = NULL;
|
struct pcmcia_driver *p_drv = NULL;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
if (!p_dev->suspended)
|
if (!p_dev->suspended)
|
||||||
|
@ -1264,7 +1266,7 @@ static int ds_event(struct pcmcia_socket *skt, event_t event, int priority)
|
||||||
} /* ds_event */
|
} /* ds_event */
|
||||||
|
|
||||||
|
|
||||||
struct pcmcia_device * pcmcia_dev_present(struct pcmcia_device *_p_dev)
|
struct pcmcia_device *pcmcia_dev_present(struct pcmcia_device *_p_dev)
|
||||||
{
|
{
|
||||||
struct pcmcia_device *p_dev;
|
struct pcmcia_device *p_dev;
|
||||||
struct pcmcia_device *ret = NULL;
|
struct pcmcia_device *ret = NULL;
|
||||||
|
@ -1329,7 +1331,7 @@ static int __devinit pcmcia_bus_add_socket(struct device *dev,
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_printk(KERN_ERR, dev, "PCMCIA registration failed\n");
|
dev_printk(KERN_ERR, dev, "PCMCIA registration failed\n");
|
||||||
pcmcia_put_socket(socket);
|
pcmcia_put_socket(socket);
|
||||||
return (ret);
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -88,12 +88,12 @@ static struct pcmcia_driver *get_pcmcia_driver(dev_info_t *dev_info)
|
||||||
|
|
||||||
p_drv = container_of(drv, struct pcmcia_driver, drv);
|
p_drv = container_of(drv, struct pcmcia_driver, drv);
|
||||||
|
|
||||||
return (p_drv);
|
return p_drv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef CONFIG_PROC_FS
|
#ifdef CONFIG_PROC_FS
|
||||||
static struct proc_dir_entry *proc_pccard = NULL;
|
static struct proc_dir_entry *proc_pccard;
|
||||||
|
|
||||||
static int proc_read_drivers_callback(struct device_driver *driver, void *_m)
|
static int proc_read_drivers_callback(struct device_driver *driver, void *_m)
|
||||||
{
|
{
|
||||||
|
@ -158,7 +158,8 @@ static int adjust_irq(struct pcmcia_socket *s, adjust_t *adj)
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
static inline int adjust_irq(struct pcmcia_socket *s, adjust_t *adj) {
|
static inline int adjust_irq(struct pcmcia_socket *s, adjust_t *adj)
|
||||||
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -195,7 +196,7 @@ static int pcmcia_adjust_resource_info(adjust_t *adj)
|
||||||
begin = adj->resource.memory.Base;
|
begin = adj->resource.memory.Base;
|
||||||
end = adj->resource.memory.Base + adj->resource.memory.Size - 1;
|
end = adj->resource.memory.Base + adj->resource.memory.Size - 1;
|
||||||
if (s->resource_ops->add_mem)
|
if (s->resource_ops->add_mem)
|
||||||
ret =s->resource_ops->add_mem(s, adj->Action, begin, end);
|
ret = s->resource_ops->add_mem(s, adj->Action, begin, end);
|
||||||
case RES_IO_RANGE:
|
case RES_IO_RANGE:
|
||||||
begin = adj->resource.io.BasePort;
|
begin = adj->resource.io.BasePort;
|
||||||
end = adj->resource.io.BasePort + adj->resource.io.NumPorts - 1;
|
end = adj->resource.io.BasePort + adj->resource.io.NumPorts - 1;
|
||||||
|
@ -215,7 +216,7 @@ static int pcmcia_adjust_resource_info(adjust_t *adj)
|
||||||
}
|
}
|
||||||
up_read(&pcmcia_socket_list_rwsem);
|
up_read(&pcmcia_socket_list_rwsem);
|
||||||
|
|
||||||
return (ret);
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -490,7 +491,7 @@ static int bind_request(struct pcmcia_socket *s, bind_info_t *bind_info)
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_lock_irqsave(&pcmcia_dev_list_lock, flags);
|
spin_lock_irqsave(&pcmcia_dev_list_lock, flags);
|
||||||
list_for_each_entry(p_dev, &s->devices_list, socket_device_list) {
|
list_for_each_entry(p_dev, &s->devices_list, socket_device_list) {
|
||||||
if (p_dev->func == bind_info->function) {
|
if (p_dev->func == bind_info->function) {
|
||||||
if ((p_dev->dev.driver == &p_drv->drv)) {
|
if ((p_dev->dev.driver == &p_drv->drv)) {
|
||||||
if (p_dev->cardmgr) {
|
if (p_dev->cardmgr) {
|
||||||
|
@ -558,7 +559,7 @@ rescan:
|
||||||
err_put:
|
err_put:
|
||||||
pcmcia_put_socket(s);
|
pcmcia_put_socket(s);
|
||||||
|
|
||||||
return (ret);
|
return ret;
|
||||||
} /* bind_request */
|
} /* bind_request */
|
||||||
|
|
||||||
#ifdef CONFIG_CARDBUS
|
#ifdef CONFIG_CARDBUS
|
||||||
|
@ -655,7 +656,7 @@ static int get_device_info(struct pcmcia_socket *s, bind_info_t *bind_info, int
|
||||||
|
|
||||||
err_put:
|
err_put:
|
||||||
pcmcia_put_dev(p_dev);
|
pcmcia_put_dev(p_dev);
|
||||||
return (ret);
|
return ret;
|
||||||
} /* get_device_info */
|
} /* get_device_info */
|
||||||
|
|
||||||
|
|
||||||
|
@ -664,7 +665,7 @@ static int ds_open(struct inode *inode, struct file *file)
|
||||||
socket_t i = iminor(inode);
|
socket_t i = iminor(inode);
|
||||||
struct pcmcia_socket *s;
|
struct pcmcia_socket *s;
|
||||||
user_info_t *user;
|
user_info_t *user;
|
||||||
static int warning_printed = 0;
|
static int warning_printed;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
pr_debug("ds_open(socket %d)\n", i);
|
pr_debug("ds_open(socket %d)\n", i);
|
||||||
|
@ -738,12 +739,13 @@ static int ds_release(struct inode *inode, struct file *file)
|
||||||
s = user->socket;
|
s = user->socket;
|
||||||
|
|
||||||
/* Unlink user data structure */
|
/* Unlink user data structure */
|
||||||
if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
|
if ((file->f_flags & O_ACCMODE) != O_RDONLY)
|
||||||
s->pcmcia_state.busy = 0;
|
s->pcmcia_state.busy = 0;
|
||||||
}
|
|
||||||
file->private_data = NULL;
|
file->private_data = NULL;
|
||||||
for (link = &s->user; *link; link = &(*link)->next)
|
for (link = &s->user; *link; link = &(*link)->next)
|
||||||
if (*link == user) break;
|
if (*link == user)
|
||||||
|
break;
|
||||||
if (link == NULL)
|
if (link == NULL)
|
||||||
goto out;
|
goto out;
|
||||||
*link = user->next;
|
*link = user->next;
|
||||||
|
@ -774,7 +776,7 @@ static ssize_t ds_read(struct file *file, char __user *buf,
|
||||||
|
|
||||||
s = user->socket;
|
s = user->socket;
|
||||||
if (s->pcmcia_state.dead)
|
if (s->pcmcia_state.dead)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
ret = wait_event_interruptible(s->queue, !queue_empty(user));
|
ret = wait_event_interruptible(s->queue, !queue_empty(user));
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
|
@ -824,7 +826,7 @@ static u_int ds_poll(struct file *file, poll_table *wait)
|
||||||
|
|
||||||
/*====================================================================*/
|
/*====================================================================*/
|
||||||
|
|
||||||
static int ds_ioctl(struct inode * inode, struct file * file,
|
static int ds_ioctl(struct inode *inode, struct file *file,
|
||||||
u_int cmd, u_long arg)
|
u_int cmd, u_long arg)
|
||||||
{
|
{
|
||||||
struct pcmcia_socket *s;
|
struct pcmcia_socket *s;
|
||||||
|
@ -842,10 +844,11 @@ static int ds_ioctl(struct inode * inode, struct file * file,
|
||||||
|
|
||||||
s = user->socket;
|
s = user->socket;
|
||||||
if (s->pcmcia_state.dead)
|
if (s->pcmcia_state.dead)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
size = (cmd & IOCSIZE_MASK) >> IOCSIZE_SHIFT;
|
size = (cmd & IOCSIZE_MASK) >> IOCSIZE_SHIFT;
|
||||||
if (size > sizeof(ds_ioctl_arg_t)) return -EINVAL;
|
if (size > sizeof(ds_ioctl_arg_t))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
/* Permission check */
|
/* Permission check */
|
||||||
if (!(cmd & IOC_OUT) && !capable(CAP_SYS_ADMIN))
|
if (!(cmd & IOC_OUT) && !capable(CAP_SYS_ADMIN))
|
||||||
|
@ -1024,8 +1027,8 @@ static int ds_ioctl(struct inode * inode, struct file * file,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cmd & IOC_OUT) {
|
if (cmd & IOC_OUT) {
|
||||||
if (__copy_to_user(uarg, (char *)buf, size))
|
if (__copy_to_user(uarg, (char *)buf, size))
|
||||||
err = -EFAULT;
|
err = -EFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
free_out:
|
free_out:
|
||||||
|
@ -1045,7 +1048,8 @@ static const struct file_operations ds_fops = {
|
||||||
.poll = ds_poll,
|
.poll = ds_poll,
|
||||||
};
|
};
|
||||||
|
|
||||||
void __init pcmcia_setup_ioctl(void) {
|
void __init pcmcia_setup_ioctl(void)
|
||||||
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* Set up character device for user mode clients */
|
/* Set up character device for user mode clients */
|
||||||
|
@ -1064,7 +1068,8 @@ void __init pcmcia_setup_ioctl(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void __exit pcmcia_cleanup_ioctl(void) {
|
void __exit pcmcia_cleanup_ioctl(void)
|
||||||
|
{
|
||||||
#ifdef CONFIG_PROC_FS
|
#ifdef CONFIG_PROC_FS
|
||||||
if (proc_pccard) {
|
if (proc_pccard) {
|
||||||
remove_proc_entry("drivers", proc_pccard);
|
remove_proc_entry("drivers", proc_pccard);
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
|
|
||||||
|
|
||||||
/* Access speed for IO windows */
|
/* Access speed for IO windows */
|
||||||
static int io_speed = 0;
|
static int io_speed;
|
||||||
module_param(io_speed, int, 0444);
|
module_param(io_speed, int, 0444);
|
||||||
|
|
||||||
|
|
||||||
|
@ -62,7 +62,8 @@ static int alloc_io_space(struct pcmcia_socket *s, u_int attr,
|
||||||
num, align);
|
num, align);
|
||||||
align = 0;
|
align = 0;
|
||||||
} else
|
} else
|
||||||
while (align && (align < num)) align <<= 1;
|
while (align && (align < num))
|
||||||
|
align <<= 1;
|
||||||
}
|
}
|
||||||
if (*base & ~(align-1)) {
|
if (*base & ~(align-1)) {
|
||||||
dev_dbg(&s->dev, "odd IO request: base %#x align %#x\n",
|
dev_dbg(&s->dev, "odd IO request: base %#x align %#x\n",
|
||||||
|
@ -338,7 +339,7 @@ static int pcmcia_release_io(struct pcmcia_device *p_dev, io_req_t *req)
|
||||||
struct pcmcia_socket *s = p_dev->socket;
|
struct pcmcia_socket *s = p_dev->socket;
|
||||||
config_t *c = p_dev->function_config;
|
config_t *c = p_dev->function_config;
|
||||||
|
|
||||||
if (!p_dev->_io )
|
if (!p_dev->_io)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
p_dev->_io = 0;
|
p_dev->_io = 0;
|
||||||
|
@ -362,7 +363,7 @@ static int pcmcia_release_io(struct pcmcia_device *p_dev, io_req_t *req)
|
||||||
static int pcmcia_release_irq(struct pcmcia_device *p_dev, irq_req_t *req)
|
static int pcmcia_release_irq(struct pcmcia_device *p_dev, irq_req_t *req)
|
||||||
{
|
{
|
||||||
struct pcmcia_socket *s = p_dev->socket;
|
struct pcmcia_socket *s = p_dev->socket;
|
||||||
config_t *c= p_dev->function_config;
|
config_t *c = p_dev->function_config;
|
||||||
|
|
||||||
if (!p_dev->_irq)
|
if (!p_dev->_irq)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -383,9 +384,8 @@ static int pcmcia_release_irq(struct pcmcia_device *p_dev, irq_req_t *req)
|
||||||
s->irq.AssignedIRQ = 0;
|
s->irq.AssignedIRQ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (req->Handler) {
|
if (req->Handler)
|
||||||
free_irq(req->AssignedIRQ, p_dev->priv);
|
free_irq(req->AssignedIRQ, p_dev->priv);
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_PCMCIA_PROBE
|
#ifdef CONFIG_PCMCIA_PROBE
|
||||||
pcmcia_used_irq[req->AssignedIRQ]--;
|
pcmcia_used_irq[req->AssignedIRQ]--;
|
||||||
|
@ -656,7 +656,8 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req)
|
||||||
type = IRQF_SHARED;
|
type = IRQF_SHARED;
|
||||||
else if (req->Attributes & IRQ_TYPE_DYNAMIC_SHARING)
|
else if (req->Attributes & IRQ_TYPE_DYNAMIC_SHARING)
|
||||||
type = IRQF_SHARED;
|
type = IRQF_SHARED;
|
||||||
else printk(KERN_WARNING "pcmcia: Driver needs updating to support IRQ sharing.\n");
|
else
|
||||||
|
printk(KERN_WARNING "pcmcia: Driver needs updating to support IRQ sharing.\n");
|
||||||
|
|
||||||
#ifdef CONFIG_PCMCIA_PROBE
|
#ifdef CONFIG_PCMCIA_PROBE
|
||||||
|
|
||||||
|
@ -788,7 +789,8 @@ int pcmcia_request_window(struct pcmcia_device *p_dev, win_req_t *req, window_ha
|
||||||
|
|
||||||
/* Allocate system memory window */
|
/* Allocate system memory window */
|
||||||
for (w = 0; w < MAX_WIN; w++)
|
for (w = 0; w < MAX_WIN; w++)
|
||||||
if (!(s->state & SOCKET_WIN_REQ(w))) break;
|
if (!(s->state & SOCKET_WIN_REQ(w)))
|
||||||
|
break;
|
||||||
if (w == MAX_WIN) {
|
if (w == MAX_WIN) {
|
||||||
dev_dbg(&s->dev, "all windows are used already\n");
|
dev_dbg(&s->dev, "all windows are used already\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -826,18 +828,19 @@ int pcmcia_request_window(struct pcmcia_device *p_dev, win_req_t *req, window_ha
|
||||||
s->state |= SOCKET_WIN_REQ(w);
|
s->state |= SOCKET_WIN_REQ(w);
|
||||||
|
|
||||||
/* Return window handle */
|
/* Return window handle */
|
||||||
if (s->features & SS_CAP_STATIC_MAP) {
|
if (s->features & SS_CAP_STATIC_MAP)
|
||||||
req->Base = win->static_start;
|
req->Base = win->static_start;
|
||||||
} else {
|
else
|
||||||
req->Base = win->res->start;
|
req->Base = win->res->start;
|
||||||
}
|
|
||||||
*wh = w + 1;
|
*wh = w + 1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
} /* pcmcia_request_window */
|
} /* pcmcia_request_window */
|
||||||
EXPORT_SYMBOL(pcmcia_request_window);
|
EXPORT_SYMBOL(pcmcia_request_window);
|
||||||
|
|
||||||
void pcmcia_disable_device(struct pcmcia_device *p_dev) {
|
void pcmcia_disable_device(struct pcmcia_device *p_dev)
|
||||||
|
{
|
||||||
pcmcia_release_configuration(p_dev);
|
pcmcia_release_configuration(p_dev);
|
||||||
pcmcia_release_io(p_dev, &p_dev->io);
|
pcmcia_release_io(p_dev, &p_dev->io);
|
||||||
pcmcia_release_irq(p_dev, &p_dev->irq);
|
pcmcia_release_irq(p_dev, &p_dev->irq);
|
||||||
|
@ -970,7 +973,7 @@ int pcmcia_loop_tuple(struct pcmcia_device *p_dev, cisdata_t code,
|
||||||
|
|
||||||
return pccard_loop_tuple(p_dev->socket, p_dev->func, code, NULL,
|
return pccard_loop_tuple(p_dev->socket, p_dev->func, code, NULL,
|
||||||
&loop, pcmcia_do_loop_tuple);
|
&loop, pcmcia_do_loop_tuple);
|
||||||
};
|
}
|
||||||
EXPORT_SYMBOL(pcmcia_loop_tuple);
|
EXPORT_SYMBOL(pcmcia_loop_tuple);
|
||||||
|
|
||||||
|
|
||||||
|
@ -1000,7 +1003,7 @@ static int pcmcia_do_get_tuple(struct pcmcia_device *p_dev, tuple_t *tuple,
|
||||||
} else
|
} else
|
||||||
dev_dbg(&p_dev->dev, "do_get_tuple: out of memory\n");
|
dev_dbg(&p_dev->dev, "do_get_tuple: out of memory\n");
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* pcmcia_get_tuple() - get first tuple from CIS
|
* pcmcia_get_tuple() - get first tuple from CIS
|
||||||
|
@ -1024,7 +1027,7 @@ size_t pcmcia_get_tuple(struct pcmcia_device *p_dev, cisdata_t code,
|
||||||
pcmcia_loop_tuple(p_dev, code, pcmcia_do_get_tuple, &get);
|
pcmcia_loop_tuple(p_dev, code, pcmcia_do_get_tuple, &get);
|
||||||
|
|
||||||
return get.len;
|
return get.len;
|
||||||
};
|
}
|
||||||
EXPORT_SYMBOL(pcmcia_get_tuple);
|
EXPORT_SYMBOL(pcmcia_get_tuple);
|
||||||
|
|
||||||
|
|
||||||
|
@ -1057,7 +1060,7 @@ static int pcmcia_do_get_mac(struct pcmcia_device *p_dev, tuple_t *tuple,
|
||||||
for (i = 0; i < 6; i++)
|
for (i = 0; i < 6; i++)
|
||||||
dev->dev_addr[i] = tuple->TupleData[i+2];
|
dev->dev_addr[i] = tuple->TupleData[i+2];
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* pcmcia_get_mac_from_cis() - read out MAC address from CISTPL_FUNCE
|
* pcmcia_get_mac_from_cis() - read out MAC address from CISTPL_FUNCE
|
||||||
|
@ -1071,6 +1074,6 @@ static int pcmcia_do_get_mac(struct pcmcia_device *p_dev, tuple_t *tuple,
|
||||||
int pcmcia_get_mac_from_cis(struct pcmcia_device *p_dev, struct net_device *dev)
|
int pcmcia_get_mac_from_cis(struct pcmcia_device *p_dev, struct net_device *dev)
|
||||||
{
|
{
|
||||||
return pcmcia_loop_tuple(p_dev, CISTPL_FUNCE, pcmcia_do_get_mac, dev);
|
return pcmcia_loop_tuple(p_dev, CISTPL_FUNCE, pcmcia_do_get_mac, dev);
|
||||||
};
|
}
|
||||||
EXPORT_SYMBOL(pcmcia_get_mac_from_cis);
|
EXPORT_SYMBOL(pcmcia_get_mac_from_cis);
|
||||||
|
|
||||||
|
|
|
@ -126,16 +126,16 @@ static void pcmcia_align(void *align_data, struct resource *res,
|
||||||
res->start = start;
|
res->start = start;
|
||||||
|
|
||||||
#ifdef CONFIG_X86
|
#ifdef CONFIG_X86
|
||||||
if (res->flags & IORESOURCE_IO) {
|
if (res->flags & IORESOURCE_IO) {
|
||||||
if (start & 0x300) {
|
if (start & 0x300) {
|
||||||
start = (start + 0x3ff) & ~0x3ff;
|
start = (start + 0x3ff) & ~0x3ff;
|
||||||
res->start = start;
|
res->start = start;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_M68K
|
#ifdef CONFIG_M68K
|
||||||
if (res->flags & IORESOURCE_IO) {
|
if (res->flags & IORESOURCE_IO) {
|
||||||
if ((res->start + size - 1) >= 1024)
|
if ((res->start + size - 1) >= 1024)
|
||||||
res->start = res->end;
|
res->start = res->end;
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,9 +24,9 @@
|
||||||
#include <linux/timer.h>
|
#include <linux/timer.h>
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
|
#include <linux/io.h>
|
||||||
|
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
#include <asm/io.h>
|
|
||||||
|
|
||||||
#include <pcmcia/cs_types.h>
|
#include <pcmcia/cs_types.h>
|
||||||
#include <pcmcia/ss.h>
|
#include <pcmcia/ss.h>
|
||||||
|
@ -144,43 +144,44 @@ static int add_interval(struct resource_map *map, u_long base, u_long num)
|
||||||
|
|
||||||
static int sub_interval(struct resource_map *map, u_long base, u_long num)
|
static int sub_interval(struct resource_map *map, u_long base, u_long num)
|
||||||
{
|
{
|
||||||
struct resource_map *p, *q;
|
struct resource_map *p, *q;
|
||||||
|
|
||||||
for (p = map; ; p = q) {
|
for (p = map; ; p = q) {
|
||||||
q = p->next;
|
q = p->next;
|
||||||
if (q == map)
|
if (q == map)
|
||||||
break;
|
break;
|
||||||
if ((q->base+q->num > base) && (base+num > q->base)) {
|
if ((q->base+q->num > base) && (base+num > q->base)) {
|
||||||
if (q->base >= base) {
|
if (q->base >= base) {
|
||||||
if (q->base+q->num <= base+num) {
|
if (q->base+q->num <= base+num) {
|
||||||
/* Delete whole block */
|
/* Delete whole block */
|
||||||
p->next = q->next;
|
p->next = q->next;
|
||||||
kfree(q);
|
kfree(q);
|
||||||
/* don't advance the pointer yet */
|
/* don't advance the pointer yet */
|
||||||
q = p;
|
q = p;
|
||||||
} else {
|
} else {
|
||||||
/* Cut off bit from the front */
|
/* Cut off bit from the front */
|
||||||
q->num = q->base + q->num - base - num;
|
q->num = q->base + q->num - base - num;
|
||||||
q->base = base + num;
|
q->base = base + num;
|
||||||
|
}
|
||||||
|
} else if (q->base+q->num <= base+num) {
|
||||||
|
/* Cut off bit from the end */
|
||||||
|
q->num = base - q->base;
|
||||||
|
} else {
|
||||||
|
/* Split the block into two pieces */
|
||||||
|
p = kmalloc(sizeof(struct resource_map),
|
||||||
|
GFP_KERNEL);
|
||||||
|
if (!p) {
|
||||||
|
printk(KERN_WARNING "out of memory to update resources\n");
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
p->base = base+num;
|
||||||
|
p->num = q->base+q->num - p->base;
|
||||||
|
q->num = base - q->base;
|
||||||
|
p->next = q->next ; q->next = p;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (q->base+q->num <= base+num) {
|
|
||||||
/* Cut off bit from the end */
|
|
||||||
q->num = base - q->base;
|
|
||||||
} else {
|
|
||||||
/* Split the block into two pieces */
|
|
||||||
p = kmalloc(sizeof(struct resource_map), GFP_KERNEL);
|
|
||||||
if (!p) {
|
|
||||||
printk(KERN_WARNING "out of memory to update resources\n");
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
p->base = base+num;
|
|
||||||
p->num = q->base+q->num - p->base;
|
|
||||||
q->num = base - q->base;
|
|
||||||
p->next = q->next ; q->next = p;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
return 0;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*======================================================================
|
/*======================================================================
|
||||||
|
@ -194,69 +195,72 @@ static int sub_interval(struct resource_map *map, u_long base, u_long num)
|
||||||
static void do_io_probe(struct pcmcia_socket *s, unsigned int base,
|
static void do_io_probe(struct pcmcia_socket *s, unsigned int base,
|
||||||
unsigned int num)
|
unsigned int num)
|
||||||
{
|
{
|
||||||
struct resource *res;
|
struct resource *res;
|
||||||
struct socket_data *s_data = s->resource_data;
|
struct socket_data *s_data = s->resource_data;
|
||||||
unsigned int i, j, bad;
|
unsigned int i, j, bad;
|
||||||
int any;
|
int any;
|
||||||
u_char *b, hole, most;
|
u_char *b, hole, most;
|
||||||
|
|
||||||
dev_printk(KERN_INFO, &s->dev, "cs: IO port probe %#x-%#x:",
|
dev_printk(KERN_INFO, &s->dev, "cs: IO port probe %#x-%#x:",
|
||||||
base, base+num-1);
|
base, base+num-1);
|
||||||
|
|
||||||
/* First, what does a floating port look like? */
|
/* First, what does a floating port look like? */
|
||||||
b = kzalloc(256, GFP_KERNEL);
|
b = kzalloc(256, GFP_KERNEL);
|
||||||
if (!b) {
|
if (!b) {
|
||||||
printk("\n");
|
printk("\n");
|
||||||
dev_printk(KERN_ERR, &s->dev,
|
dev_printk(KERN_ERR, &s->dev,
|
||||||
"do_io_probe: unable to kmalloc 256 bytes");
|
"do_io_probe: unable to kmalloc 256 bytes");
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
for (i = base, most = 0; i < base+num; i += 8) {
|
|
||||||
res = claim_region(NULL, i, 8, IORESOURCE_IO, "PCMCIA IO probe");
|
|
||||||
if (!res)
|
|
||||||
continue;
|
|
||||||
hole = inb(i);
|
|
||||||
for (j = 1; j < 8; j++)
|
|
||||||
if (inb(i+j) != hole) break;
|
|
||||||
free_region(res);
|
|
||||||
if ((j == 8) && (++b[hole] > b[most]))
|
|
||||||
most = hole;
|
|
||||||
if (b[most] == 127) break;
|
|
||||||
}
|
|
||||||
kfree(b);
|
|
||||||
|
|
||||||
bad = any = 0;
|
|
||||||
for (i = base; i < base+num; i += 8) {
|
|
||||||
res = claim_region(NULL, i, 8, IORESOURCE_IO, "PCMCIA IO probe");
|
|
||||||
if (!res)
|
|
||||||
continue;
|
|
||||||
for (j = 0; j < 8; j++)
|
|
||||||
if (inb(i+j) != most) break;
|
|
||||||
free_region(res);
|
|
||||||
if (j < 8) {
|
|
||||||
if (!any)
|
|
||||||
printk(" excluding");
|
|
||||||
if (!bad)
|
|
||||||
bad = any = i;
|
|
||||||
} else {
|
|
||||||
if (bad) {
|
|
||||||
sub_interval(&s_data->io_db, bad, i-bad);
|
|
||||||
printk(" %#x-%#x", bad, i-1);
|
|
||||||
bad = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
for (i = base, most = 0; i < base+num; i += 8) {
|
||||||
if (bad) {
|
res = claim_region(NULL, i, 8, IORESOURCE_IO, "PCMCIA ioprobe");
|
||||||
if ((num > 16) && (bad == base) && (i == base+num)) {
|
if (!res)
|
||||||
printk(" nothing: probe failed.\n");
|
continue;
|
||||||
return;
|
hole = inb(i);
|
||||||
} else {
|
for (j = 1; j < 8; j++)
|
||||||
sub_interval(&s_data->io_db, bad, i-bad);
|
if (inb(i+j) != hole)
|
||||||
printk(" %#x-%#x", bad, i-1);
|
break;
|
||||||
|
free_region(res);
|
||||||
|
if ((j == 8) && (++b[hole] > b[most]))
|
||||||
|
most = hole;
|
||||||
|
if (b[most] == 127)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
kfree(b);
|
||||||
|
|
||||||
printk(any ? "\n" : " clean.\n");
|
bad = any = 0;
|
||||||
|
for (i = base; i < base+num; i += 8) {
|
||||||
|
res = claim_region(NULL, i, 8, IORESOURCE_IO, "PCMCIA ioprobe");
|
||||||
|
if (!res)
|
||||||
|
continue;
|
||||||
|
for (j = 0; j < 8; j++)
|
||||||
|
if (inb(i+j) != most)
|
||||||
|
break;
|
||||||
|
free_region(res);
|
||||||
|
if (j < 8) {
|
||||||
|
if (!any)
|
||||||
|
printk(" excluding");
|
||||||
|
if (!bad)
|
||||||
|
bad = any = i;
|
||||||
|
} else {
|
||||||
|
if (bad) {
|
||||||
|
sub_interval(&s_data->io_db, bad, i-bad);
|
||||||
|
printk(" %#x-%#x", bad, i-1);
|
||||||
|
bad = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (bad) {
|
||||||
|
if ((num > 16) && (bad == base) && (i == base+num)) {
|
||||||
|
printk(" nothing: probe failed.\n");
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
sub_interval(&s_data->io_db, bad, i-bad);
|
||||||
|
printk(" %#x-%#x", bad, i-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printk(any ? "\n" : " clean.\n");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -327,8 +331,9 @@ cis_readable(struct pcmcia_socket *s, unsigned long base, unsigned long size)
|
||||||
unsigned int info1, info2;
|
unsigned int info1, info2;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
res1 = claim_region(s, base, size/2, IORESOURCE_MEM, "cs memory probe");
|
res1 = claim_region(s, base, size/2, IORESOURCE_MEM, "PCMCIA memprobe");
|
||||||
res2 = claim_region(s, base + size/2, size/2, IORESOURCE_MEM, "cs memory probe");
|
res2 = claim_region(s, base + size/2, size/2, IORESOURCE_MEM,
|
||||||
|
"PCMCIA memprobe");
|
||||||
|
|
||||||
if (res1 && res2) {
|
if (res1 && res2) {
|
||||||
ret = readable(s, res1, &info1);
|
ret = readable(s, res1, &info1);
|
||||||
|
@ -347,8 +352,9 @@ checksum_match(struct pcmcia_socket *s, unsigned long base, unsigned long size)
|
||||||
struct resource *res1, *res2;
|
struct resource *res1, *res2;
|
||||||
int a = -1, b = -1;
|
int a = -1, b = -1;
|
||||||
|
|
||||||
res1 = claim_region(s, base, size/2, IORESOURCE_MEM, "cs memory probe");
|
res1 = claim_region(s, base, size/2, IORESOURCE_MEM, "PCMCIA memprobe");
|
||||||
res2 = claim_region(s, base + size/2, size/2, IORESOURCE_MEM, "cs memory probe");
|
res2 = claim_region(s, base + size/2, size/2, IORESOURCE_MEM,
|
||||||
|
"PCMCIA memprobe");
|
||||||
|
|
||||||
if (res1 && res2) {
|
if (res1 && res2) {
|
||||||
a = checksum(s, res1);
|
a = checksum(s, res1);
|
||||||
|
@ -371,42 +377,43 @@ checksum_match(struct pcmcia_socket *s, unsigned long base, unsigned long size)
|
||||||
|
|
||||||
static int do_mem_probe(u_long base, u_long num, struct pcmcia_socket *s)
|
static int do_mem_probe(u_long base, u_long num, struct pcmcia_socket *s)
|
||||||
{
|
{
|
||||||
struct socket_data *s_data = s->resource_data;
|
struct socket_data *s_data = s->resource_data;
|
||||||
u_long i, j, bad, fail, step;
|
u_long i, j, bad, fail, step;
|
||||||
|
|
||||||
dev_printk(KERN_INFO, &s->dev, "cs: memory probe 0x%06lx-0x%06lx:",
|
dev_printk(KERN_INFO, &s->dev, "cs: memory probe 0x%06lx-0x%06lx:",
|
||||||
base, base+num-1);
|
base, base+num-1);
|
||||||
bad = fail = 0;
|
bad = fail = 0;
|
||||||
step = (num < 0x20000) ? 0x2000 : ((num>>4) & ~0x1fff);
|
step = (num < 0x20000) ? 0x2000 : ((num>>4) & ~0x1fff);
|
||||||
/* don't allow too large steps */
|
/* don't allow too large steps */
|
||||||
if (step > 0x800000)
|
if (step > 0x800000)
|
||||||
step = 0x800000;
|
step = 0x800000;
|
||||||
/* cis_readable wants to map 2x map_size */
|
/* cis_readable wants to map 2x map_size */
|
||||||
if (step < 2 * s->map_size)
|
if (step < 2 * s->map_size)
|
||||||
step = 2 * s->map_size;
|
step = 2 * s->map_size;
|
||||||
for (i = j = base; i < base+num; i = j + step) {
|
for (i = j = base; i < base+num; i = j + step) {
|
||||||
if (!fail) {
|
if (!fail) {
|
||||||
for (j = i; j < base+num; j += step) {
|
for (j = i; j < base+num; j += step) {
|
||||||
if (cis_readable(s, j, step))
|
if (cis_readable(s, j, step))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
fail = ((i == base) && (j == base+num));
|
fail = ((i == base) && (j == base+num));
|
||||||
|
}
|
||||||
|
if (fail) {
|
||||||
|
for (j = i; j < base+num; j += 2*step)
|
||||||
|
if (checksum_match(s, j, step) &&
|
||||||
|
checksum_match(s, j + step, step))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i != j) {
|
||||||
|
if (!bad)
|
||||||
|
printk(" excluding");
|
||||||
|
printk(" %#05lx-%#05lx", i, j-1);
|
||||||
|
sub_interval(&s_data->mem_db, i, j-i);
|
||||||
|
bad += j-i;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (fail) {
|
printk(bad ? "\n" : " clean.\n");
|
||||||
for (j = i; j < base+num; j += 2*step)
|
return num - bad;
|
||||||
if (checksum_match(s, j, step) &&
|
|
||||||
checksum_match(s, j + step, step))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (i != j) {
|
|
||||||
if (!bad) printk(" excluding");
|
|
||||||
printk(" %#05lx-%#05lx", i, j-1);
|
|
||||||
sub_interval(&s_data->mem_db, i, j-i);
|
|
||||||
bad += j-i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
printk(bad ? "\n" : " clean.\n");
|
|
||||||
return (num - bad);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_PCMCIA_PROBE
|
#ifdef CONFIG_PCMCIA_PROBE
|
||||||
|
@ -656,7 +663,7 @@ static struct resource *nonstatic_find_io_region(unsigned long base, int num,
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct resource * nonstatic_find_mem_region(u_long base, u_long num,
|
static struct resource *nonstatic_find_mem_region(u_long base, u_long num,
|
||||||
u_long align, int low, struct pcmcia_socket *s)
|
u_long align, int low, struct pcmcia_socket *s)
|
||||||
{
|
{
|
||||||
struct resource *res = make_resource(0, num, IORESOURCE_MEM, dev_name(&s->dev));
|
struct resource *res = make_resource(0, num, IORESOURCE_MEM, dev_name(&s->dev));
|
||||||
|
@ -794,7 +801,7 @@ static int nonstatic_autoadd_resources(struct pcmcia_socket *s)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (i=0; i < PCI_BUS_NUM_RESOURCES; i++) {
|
for (i = 0; i < PCI_BUS_NUM_RESOURCES; i++) {
|
||||||
res = s->cb_dev->bus->resource[i];
|
res = s->cb_dev->bus->resource[i];
|
||||||
if (!res)
|
if (!res)
|
||||||
continue;
|
continue;
|
||||||
|
@ -908,14 +915,14 @@ static ssize_t show_io_db(struct device *dev,
|
||||||
for (p = data->io_db.next; p != &data->io_db; p = p->next) {
|
for (p = data->io_db.next; p != &data->io_db; p = p->next) {
|
||||||
if (ret > (PAGE_SIZE - 10))
|
if (ret > (PAGE_SIZE - 10))
|
||||||
continue;
|
continue;
|
||||||
ret += snprintf (&buf[ret], (PAGE_SIZE - ret - 1),
|
ret += snprintf(&buf[ret], (PAGE_SIZE - ret - 1),
|
||||||
"0x%08lx - 0x%08lx\n",
|
"0x%08lx - 0x%08lx\n",
|
||||||
((unsigned long) p->base),
|
((unsigned long) p->base),
|
||||||
((unsigned long) p->base + p->num - 1));
|
((unsigned long) p->base + p->num - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_unlock(&rsrc_mutex);
|
mutex_unlock(&rsrc_mutex);
|
||||||
return (ret);
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t store_io_db(struct device *dev,
|
static ssize_t store_io_db(struct device *dev,
|
||||||
|
@ -927,12 +934,13 @@ static ssize_t store_io_db(struct device *dev,
|
||||||
unsigned int add = ADD_MANAGED_RESOURCE;
|
unsigned int add = ADD_MANAGED_RESOURCE;
|
||||||
ssize_t ret = 0;
|
ssize_t ret = 0;
|
||||||
|
|
||||||
ret = sscanf (buf, "+ 0x%lx - 0x%lx", &start_addr, &end_addr);
|
ret = sscanf(buf, "+ 0x%lx - 0x%lx", &start_addr, &end_addr);
|
||||||
if (ret != 2) {
|
if (ret != 2) {
|
||||||
ret = sscanf (buf, "- 0x%lx - 0x%lx", &start_addr, &end_addr);
|
ret = sscanf(buf, "- 0x%lx - 0x%lx", &start_addr, &end_addr);
|
||||||
add = REMOVE_MANAGED_RESOURCE;
|
add = REMOVE_MANAGED_RESOURCE;
|
||||||
if (ret != 2) {
|
if (ret != 2) {
|
||||||
ret = sscanf (buf, "0x%lx - 0x%lx", &start_addr, &end_addr);
|
ret = sscanf(buf, "0x%lx - 0x%lx", &start_addr,
|
||||||
|
&end_addr);
|
||||||
add = ADD_MANAGED_RESOURCE;
|
add = ADD_MANAGED_RESOURCE;
|
||||||
if (ret != 2)
|
if (ret != 2)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -963,14 +971,14 @@ static ssize_t show_mem_db(struct device *dev,
|
||||||
for (p = data->mem_db.next; p != &data->mem_db; p = p->next) {
|
for (p = data->mem_db.next; p != &data->mem_db; p = p->next) {
|
||||||
if (ret > (PAGE_SIZE - 10))
|
if (ret > (PAGE_SIZE - 10))
|
||||||
continue;
|
continue;
|
||||||
ret += snprintf (&buf[ret], (PAGE_SIZE - ret - 1),
|
ret += snprintf(&buf[ret], (PAGE_SIZE - ret - 1),
|
||||||
"0x%08lx - 0x%08lx\n",
|
"0x%08lx - 0x%08lx\n",
|
||||||
((unsigned long) p->base),
|
((unsigned long) p->base),
|
||||||
((unsigned long) p->base + p->num - 1));
|
((unsigned long) p->base + p->num - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_unlock(&rsrc_mutex);
|
mutex_unlock(&rsrc_mutex);
|
||||||
return (ret);
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t store_mem_db(struct device *dev,
|
static ssize_t store_mem_db(struct device *dev,
|
||||||
|
@ -982,12 +990,13 @@ static ssize_t store_mem_db(struct device *dev,
|
||||||
unsigned int add = ADD_MANAGED_RESOURCE;
|
unsigned int add = ADD_MANAGED_RESOURCE;
|
||||||
ssize_t ret = 0;
|
ssize_t ret = 0;
|
||||||
|
|
||||||
ret = sscanf (buf, "+ 0x%lx - 0x%lx", &start_addr, &end_addr);
|
ret = sscanf(buf, "+ 0x%lx - 0x%lx", &start_addr, &end_addr);
|
||||||
if (ret != 2) {
|
if (ret != 2) {
|
||||||
ret = sscanf (buf, "- 0x%lx - 0x%lx", &start_addr, &end_addr);
|
ret = sscanf(buf, "- 0x%lx - 0x%lx", &start_addr, &end_addr);
|
||||||
add = REMOVE_MANAGED_RESOURCE;
|
add = REMOVE_MANAGED_RESOURCE;
|
||||||
if (ret != 2) {
|
if (ret != 2) {
|
||||||
ret = sscanf (buf, "0x%lx - 0x%lx", &start_addr, &end_addr);
|
ret = sscanf(buf, "0x%lx - 0x%lx", &start_addr,
|
||||||
|
&end_addr);
|
||||||
add = ADD_MANAGED_RESOURCE;
|
add = ADD_MANAGED_RESOURCE;
|
||||||
if (ret != 2)
|
if (ret != 2)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
|
@ -164,7 +164,7 @@ static ssize_t pccard_store_irq_mask(struct device *dev,
|
||||||
if (!count)
|
if (!count)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
ret = sscanf (buf, "0x%x\n", &mask);
|
ret = sscanf(buf, "0x%x\n", &mask);
|
||||||
|
|
||||||
if (ret == 1) {
|
if (ret == 1) {
|
||||||
s->irq_mask &= mask;
|
s->irq_mask &= mask;
|
||||||
|
@ -278,7 +278,7 @@ static ssize_t pccard_extract_cis(struct pcmcia_socket *s, char *buf, loff_t off
|
||||||
free_tuple:
|
free_tuple:
|
||||||
kfree(tuplebuffer);
|
kfree(tuplebuffer);
|
||||||
|
|
||||||
return (ret);
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t pccard_show_cis(struct kobject *kobj,
|
static ssize_t pccard_show_cis(struct kobject *kobj,
|
||||||
|
@ -308,7 +308,7 @@ static ssize_t pccard_show_cis(struct kobject *kobj,
|
||||||
count = pccard_extract_cis(s, buf, off, count);
|
count = pccard_extract_cis(s, buf, off, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (count);
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t pccard_store_cis(struct kobject *kobj,
|
static ssize_t pccard_store_cis(struct kobject *kobj,
|
||||||
|
|
|
@ -16,13 +16,12 @@
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
#include <linux/io.h>
|
||||||
|
|
||||||
#include <pcmcia/cs_types.h>
|
#include <pcmcia/cs_types.h>
|
||||||
#include <pcmcia/ss.h>
|
#include <pcmcia/ss.h>
|
||||||
#include <pcmcia/cs.h>
|
#include <pcmcia/cs.h>
|
||||||
|
|
||||||
#include <asm/io.h>
|
|
||||||
|
|
||||||
#include "yenta_socket.h"
|
#include "yenta_socket.h"
|
||||||
#include "i82365.h"
|
#include "i82365.h"
|
||||||
|
|
||||||
|
@ -55,7 +54,7 @@ static int yenta_probe_cb_irq(struct yenta_socket *socket);
|
||||||
|
|
||||||
static unsigned int override_bios;
|
static unsigned int override_bios;
|
||||||
module_param(override_bios, uint, 0000);
|
module_param(override_bios, uint, 0000);
|
||||||
MODULE_PARM_DESC (override_bios, "yenta ignore bios resource allocation");
|
MODULE_PARM_DESC(override_bios, "yenta ignore bios resource allocation");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Generate easy-to-use ways of reading a cardbus sockets
|
* Generate easy-to-use ways of reading a cardbus sockets
|
||||||
|
@ -237,24 +236,42 @@ static void yenta_set_power(struct yenta_socket *socket, socket_state_t *state)
|
||||||
/* i82365SL-DF style */
|
/* i82365SL-DF style */
|
||||||
if (socket->flags & YENTA_16BIT_POWER_DF) {
|
if (socket->flags & YENTA_16BIT_POWER_DF) {
|
||||||
switch (state->Vcc) {
|
switch (state->Vcc) {
|
||||||
case 33: reg |= I365_VCC_3V; break;
|
case 33:
|
||||||
case 50: reg |= I365_VCC_5V; break;
|
reg |= I365_VCC_3V;
|
||||||
default: reg = 0; break;
|
break;
|
||||||
|
case 50:
|
||||||
|
reg |= I365_VCC_5V;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
reg = 0;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
switch (state->Vpp) {
|
switch (state->Vpp) {
|
||||||
case 33:
|
case 33:
|
||||||
case 50: reg |= I365_VPP1_5V; break;
|
case 50:
|
||||||
case 120: reg |= I365_VPP1_12V; break;
|
reg |= I365_VPP1_5V;
|
||||||
|
break;
|
||||||
|
case 120:
|
||||||
|
reg |= I365_VPP1_12V;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* i82365SL-B style */
|
/* i82365SL-B style */
|
||||||
switch (state->Vcc) {
|
switch (state->Vcc) {
|
||||||
case 50: reg |= I365_VCC_5V; break;
|
case 50:
|
||||||
default: reg = 0; break;
|
reg |= I365_VCC_5V;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
reg = 0;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
switch (state->Vpp) {
|
switch (state->Vpp) {
|
||||||
case 50: reg |= I365_VPP1_5V | I365_VPP2_5V; break;
|
case 50:
|
||||||
case 120: reg |= I365_VPP1_12V | I365_VPP2_12V; break;
|
reg |= I365_VPP1_5V | I365_VPP2_5V;
|
||||||
|
break;
|
||||||
|
case 120:
|
||||||
|
reg |= I365_VPP1_12V | I365_VPP2_12V;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -263,14 +280,26 @@ static void yenta_set_power(struct yenta_socket *socket, socket_state_t *state)
|
||||||
} else {
|
} else {
|
||||||
u32 reg = 0; /* CB_SC_STPCLK? */
|
u32 reg = 0; /* CB_SC_STPCLK? */
|
||||||
switch (state->Vcc) {
|
switch (state->Vcc) {
|
||||||
case 33: reg = CB_SC_VCC_3V; break;
|
case 33:
|
||||||
case 50: reg = CB_SC_VCC_5V; break;
|
reg = CB_SC_VCC_3V;
|
||||||
default: reg = 0; break;
|
break;
|
||||||
|
case 50:
|
||||||
|
reg = CB_SC_VCC_5V;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
reg = 0;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
switch (state->Vpp) {
|
switch (state->Vpp) {
|
||||||
case 33: reg |= CB_SC_VPP_3V; break;
|
case 33:
|
||||||
case 50: reg |= CB_SC_VPP_5V; break;
|
reg |= CB_SC_VPP_3V;
|
||||||
case 120: reg |= CB_SC_VPP_12V; break;
|
break;
|
||||||
|
case 50:
|
||||||
|
reg |= CB_SC_VPP_5V;
|
||||||
|
break;
|
||||||
|
case 120:
|
||||||
|
reg |= CB_SC_VPP_12V;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
if (reg != cb_readl(socket, CB_SOCKET_CONTROL))
|
if (reg != cb_readl(socket, CB_SOCKET_CONTROL))
|
||||||
cb_writel(socket, CB_SOCKET_CONTROL, reg);
|
cb_writel(socket, CB_SOCKET_CONTROL, reg);
|
||||||
|
@ -314,23 +343,29 @@ static int yenta_set_socket(struct pcmcia_socket *sock, socket_state_t *state)
|
||||||
|
|
||||||
reg = exca_readb(socket, I365_POWER) & (I365_VCC_MASK|I365_VPP1_MASK);
|
reg = exca_readb(socket, I365_POWER) & (I365_VCC_MASK|I365_VPP1_MASK);
|
||||||
reg |= I365_PWR_NORESET;
|
reg |= I365_PWR_NORESET;
|
||||||
if (state->flags & SS_PWR_AUTO) reg |= I365_PWR_AUTO;
|
if (state->flags & SS_PWR_AUTO)
|
||||||
if (state->flags & SS_OUTPUT_ENA) reg |= I365_PWR_OUT;
|
reg |= I365_PWR_AUTO;
|
||||||
|
if (state->flags & SS_OUTPUT_ENA)
|
||||||
|
reg |= I365_PWR_OUT;
|
||||||
if (exca_readb(socket, I365_POWER) != reg)
|
if (exca_readb(socket, I365_POWER) != reg)
|
||||||
exca_writeb(socket, I365_POWER, reg);
|
exca_writeb(socket, I365_POWER, reg);
|
||||||
|
|
||||||
/* CSC interrupt: no ISA irq for CSC */
|
/* CSC interrupt: no ISA irq for CSC */
|
||||||
reg = I365_CSC_DETECT;
|
reg = I365_CSC_DETECT;
|
||||||
if (state->flags & SS_IOCARD) {
|
if (state->flags & SS_IOCARD) {
|
||||||
if (state->csc_mask & SS_STSCHG) reg |= I365_CSC_STSCHG;
|
if (state->csc_mask & SS_STSCHG)
|
||||||
|
reg |= I365_CSC_STSCHG;
|
||||||
} else {
|
} else {
|
||||||
if (state->csc_mask & SS_BATDEAD) reg |= I365_CSC_BVD1;
|
if (state->csc_mask & SS_BATDEAD)
|
||||||
if (state->csc_mask & SS_BATWARN) reg |= I365_CSC_BVD2;
|
reg |= I365_CSC_BVD1;
|
||||||
if (state->csc_mask & SS_READY) reg |= I365_CSC_READY;
|
if (state->csc_mask & SS_BATWARN)
|
||||||
|
reg |= I365_CSC_BVD2;
|
||||||
|
if (state->csc_mask & SS_READY)
|
||||||
|
reg |= I365_CSC_READY;
|
||||||
}
|
}
|
||||||
exca_writeb(socket, I365_CSCINT, reg);
|
exca_writeb(socket, I365_CSCINT, reg);
|
||||||
exca_readb(socket, I365_CSC);
|
exca_readb(socket, I365_CSC);
|
||||||
if(sock->zoom_video)
|
if (sock->zoom_video)
|
||||||
sock->zoom_video(sock, state->flags & SS_ZVCARD);
|
sock->zoom_video(sock, state->flags & SS_ZVCARD);
|
||||||
}
|
}
|
||||||
config_writew(socket, CB_BRIDGE_CONTROL, bridge);
|
config_writew(socket, CB_BRIDGE_CONTROL, bridge);
|
||||||
|
@ -368,9 +403,12 @@ static int yenta_set_io_map(struct pcmcia_socket *sock, struct pccard_io_map *io
|
||||||
exca_writew(socket, I365_IO(map)+I365_W_STOP, io->stop);
|
exca_writew(socket, I365_IO(map)+I365_W_STOP, io->stop);
|
||||||
|
|
||||||
ioctl = exca_readb(socket, I365_IOCTL) & ~I365_IOCTL_MASK(map);
|
ioctl = exca_readb(socket, I365_IOCTL) & ~I365_IOCTL_MASK(map);
|
||||||
if (io->flags & MAP_0WS) ioctl |= I365_IOCTL_0WS(map);
|
if (io->flags & MAP_0WS)
|
||||||
if (io->flags & MAP_16BIT) ioctl |= I365_IOCTL_16BIT(map);
|
ioctl |= I365_IOCTL_0WS(map);
|
||||||
if (io->flags & MAP_AUTOSZ) ioctl |= I365_IOCTL_IOCS16(map);
|
if (io->flags & MAP_16BIT)
|
||||||
|
ioctl |= I365_IOCTL_16BIT(map);
|
||||||
|
if (io->flags & MAP_AUTOSZ)
|
||||||
|
ioctl |= I365_IOCTL_IOCS16(map);
|
||||||
exca_writeb(socket, I365_IOCTL, ioctl);
|
exca_writeb(socket, I365_IOCTL, ioctl);
|
||||||
|
|
||||||
if (io->flags & MAP_ACTIVE)
|
if (io->flags & MAP_ACTIVE)
|
||||||
|
@ -416,10 +454,17 @@ static int yenta_set_mem_map(struct pcmcia_socket *sock, struct pccard_mem_map *
|
||||||
|
|
||||||
word = (stop >> 12) & 0x0fff;
|
word = (stop >> 12) & 0x0fff;
|
||||||
switch (to_cycles(mem->speed)) {
|
switch (to_cycles(mem->speed)) {
|
||||||
case 0: break;
|
case 0:
|
||||||
case 1: word |= I365_MEM_WS0; break;
|
break;
|
||||||
case 2: word |= I365_MEM_WS1; break;
|
case 1:
|
||||||
default: word |= I365_MEM_WS1 | I365_MEM_WS0; break;
|
word |= I365_MEM_WS0;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
word |= I365_MEM_WS1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
word |= I365_MEM_WS1 | I365_MEM_WS0;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
exca_writew(socket, I365_MEM(map) + I365_W_STOP, word);
|
exca_writew(socket, I365_MEM(map) + I365_W_STOP, word);
|
||||||
|
|
||||||
|
@ -547,9 +592,9 @@ static int yenta_sock_suspend(struct pcmcia_socket *sock)
|
||||||
* max 4 MB, min 16 kB. We try very hard to not get below
|
* max 4 MB, min 16 kB. We try very hard to not get below
|
||||||
* the "ACC" values, though.
|
* the "ACC" values, though.
|
||||||
*/
|
*/
|
||||||
#define BRIDGE_MEM_MAX 4*1024*1024
|
#define BRIDGE_MEM_MAX (4*1024*1024)
|
||||||
#define BRIDGE_MEM_ACC 128*1024
|
#define BRIDGE_MEM_ACC (128*1024)
|
||||||
#define BRIDGE_MEM_MIN 16*1024
|
#define BRIDGE_MEM_MIN (16*1024)
|
||||||
|
|
||||||
#define BRIDGE_IO_MAX 512
|
#define BRIDGE_IO_MAX 512
|
||||||
#define BRIDGE_IO_ACC 256
|
#define BRIDGE_IO_ACC 256
|
||||||
|
@ -574,7 +619,7 @@ static int yenta_search_one_res(struct resource *root, struct resource *res,
|
||||||
int i;
|
int i;
|
||||||
size = BRIDGE_MEM_MAX;
|
size = BRIDGE_MEM_MAX;
|
||||||
if (size > avail/8) {
|
if (size > avail/8) {
|
||||||
size=(avail+1)/8;
|
size = (avail+1)/8;
|
||||||
/* round size down to next power of 2 */
|
/* round size down to next power of 2 */
|
||||||
i = 0;
|
i = 0;
|
||||||
while ((size /= 2) != 0)
|
while ((size /= 2) != 0)
|
||||||
|
@ -590,7 +635,7 @@ static int yenta_search_one_res(struct resource *root, struct resource *res,
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (allocate_resource(root, res, size, start, end, align,
|
if (allocate_resource(root, res, size, start, end, align,
|
||||||
NULL, NULL)==0) {
|
NULL, NULL) == 0) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
size = size/2;
|
size = size/2;
|
||||||
|
@ -605,8 +650,8 @@ static int yenta_search_res(struct yenta_socket *socket, struct resource *res,
|
||||||
u32 min)
|
u32 min)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i=0; i<PCI_BUS_NUM_RESOURCES; i++) {
|
for (i = 0; i < PCI_BUS_NUM_RESOURCES; i++) {
|
||||||
struct resource * root = socket->dev->bus->resource[i];
|
struct resource *root = socket->dev->bus->resource[i];
|
||||||
if (!root)
|
if (!root)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -704,7 +749,7 @@ static void yenta_allocate_resources(struct yenta_socket *socket)
|
||||||
static void yenta_free_resources(struct yenta_socket *socket)
|
static void yenta_free_resources(struct yenta_socket *socket)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i=0;i<4;i++) {
|
for (i = 0; i < 4; i++) {
|
||||||
struct resource *res;
|
struct resource *res;
|
||||||
res = socket->dev->resource + PCI_BRIDGE_RESOURCES + i;
|
res = socket->dev->resource + PCI_BRIDGE_RESOURCES + i;
|
||||||
if (res->start != 0 && res->end != 0)
|
if (res->start != 0 && res->end != 0)
|
||||||
|
@ -898,7 +943,7 @@ static irqreturn_t yenta_probe_handler(int irq, void *dev_id)
|
||||||
{
|
{
|
||||||
struct yenta_socket *socket = (struct yenta_socket *) dev_id;
|
struct yenta_socket *socket = (struct yenta_socket *) dev_id;
|
||||||
u8 csc;
|
u8 csc;
|
||||||
u32 cb_event;
|
u32 cb_event;
|
||||||
|
|
||||||
/* Clear interrupt status for the event */
|
/* Clear interrupt status for the event */
|
||||||
cb_event = cb_readl(socket, CB_SOCKET_EVENT);
|
cb_event = cb_readl(socket, CB_SOCKET_EVENT);
|
||||||
|
@ -1019,7 +1064,7 @@ static void yenta_fixup_parent_bridge(struct pci_bus *cardbus_bridge)
|
||||||
{
|
{
|
||||||
struct list_head *tmp;
|
struct list_head *tmp;
|
||||||
unsigned char upper_limit;
|
unsigned char upper_limit;
|
||||||
/*
|
/*
|
||||||
* We only check and fix the parent bridge: All systems which need
|
* We only check and fix the parent bridge: All systems which need
|
||||||
* this fixup that have been reviewed are laptops and the only bridge
|
* this fixup that have been reviewed are laptops and the only bridge
|
||||||
* which needed fixing was the parent bridge of the CardBus bridge:
|
* which needed fixing was the parent bridge of the CardBus bridge:
|
||||||
|
@ -1038,7 +1083,7 @@ static void yenta_fixup_parent_bridge(struct pci_bus *cardbus_bridge)
|
||||||
|
|
||||||
/* check the bus ranges of all silbling bridges to prevent overlap */
|
/* check the bus ranges of all silbling bridges to prevent overlap */
|
||||||
list_for_each(tmp, &bridge_to_fix->parent->children) {
|
list_for_each(tmp, &bridge_to_fix->parent->children) {
|
||||||
struct pci_bus * silbling = pci_bus_b(tmp);
|
struct pci_bus *silbling = pci_bus_b(tmp);
|
||||||
/*
|
/*
|
||||||
* If the silbling has a higher secondary bus number
|
* If the silbling has a higher secondary bus number
|
||||||
* and it's secondary is equal or smaller than our
|
* and it's secondary is equal or smaller than our
|
||||||
|
@ -1083,7 +1128,7 @@ static void yenta_fixup_parent_bridge(struct pci_bus *cardbus_bridge)
|
||||||
* interrupt, and that we can map the cardbus area. Fill in the
|
* interrupt, and that we can map the cardbus area. Fill in the
|
||||||
* socket information structure..
|
* socket information structure..
|
||||||
*/
|
*/
|
||||||
static int __devinit yenta_probe (struct pci_dev *dev, const struct pci_device_id *id)
|
static int __devinit yenta_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
||||||
{
|
{
|
||||||
struct yenta_socket *socket;
|
struct yenta_socket *socket;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -1302,7 +1347,7 @@ static struct dev_pm_ops yenta_pm_ops = {
|
||||||
#define YENTA_PM_OPS NULL
|
#define YENTA_PM_OPS NULL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define CB_ID(vend,dev,type) \
|
#define CB_ID(vend, dev, type) \
|
||||||
{ \
|
{ \
|
||||||
.vendor = vend, \
|
.vendor = vend, \
|
||||||
.device = dev, \
|
.device = dev, \
|
||||||
|
@ -1313,7 +1358,7 @@ static struct dev_pm_ops yenta_pm_ops = {
|
||||||
.driver_data = CARDBUS_TYPE_##type, \
|
.driver_data = CARDBUS_TYPE_##type, \
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct pci_device_id yenta_table [] = {
|
static struct pci_device_id yenta_table[] = {
|
||||||
CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1031, TI),
|
CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1031, TI),
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1403,13 +1448,13 @@ static struct pci_driver yenta_cardbus_driver = {
|
||||||
|
|
||||||
static int __init yenta_socket_init(void)
|
static int __init yenta_socket_init(void)
|
||||||
{
|
{
|
||||||
return pci_register_driver (¥ta_cardbus_driver);
|
return pci_register_driver(¥ta_cardbus_driver);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void __exit yenta_socket_exit (void)
|
static void __exit yenta_socket_exit(void)
|
||||||
{
|
{
|
||||||
pci_unregister_driver (¥ta_cardbus_driver);
|
pci_unregister_driver(¥ta_cardbus_driver);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -82,7 +82,7 @@ struct pcmcia_device {
|
||||||
/* the hardware "function" device; certain subdevices can
|
/* the hardware "function" device; certain subdevices can
|
||||||
* share one hardware "function" device. */
|
* share one hardware "function" device. */
|
||||||
u8 func;
|
u8 func;
|
||||||
struct config_t* function_config;
|
struct config_t *function_config;
|
||||||
|
|
||||||
struct list_head socket_device_list;
|
struct list_head socket_device_list;
|
||||||
|
|
||||||
|
@ -121,14 +121,14 @@ struct pcmcia_device {
|
||||||
u16 manf_id;
|
u16 manf_id;
|
||||||
u16 card_id;
|
u16 card_id;
|
||||||
|
|
||||||
char * prod_id[4];
|
char *prod_id[4];
|
||||||
|
|
||||||
u64 dma_mask;
|
u64 dma_mask;
|
||||||
struct device dev;
|
struct device dev;
|
||||||
|
|
||||||
#ifdef CONFIG_PCMCIA_IOCTL
|
#ifdef CONFIG_PCMCIA_IOCTL
|
||||||
/* device driver wanted by cardmgr */
|
/* device driver wanted by cardmgr */
|
||||||
struct pcmcia_driver * cardmgr;
|
struct pcmcia_driver *cardmgr;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* data private to drivers */
|
/* data private to drivers */
|
||||||
|
|
|
@ -15,8 +15,8 @@
|
||||||
#ifndef _LINUX_MEM_OP_H
|
#ifndef _LINUX_MEM_OP_H
|
||||||
#define _LINUX_MEM_OP_H
|
#define _LINUX_MEM_OP_H
|
||||||
|
|
||||||
|
#include <linux/io.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/io.h>
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
If UNSAFE_MEMCPY is defined, we use the (optimized) system routines
|
If UNSAFE_MEMCPY is defined, we use the (optimized) system routines
|
||||||
|
|
|
@ -154,7 +154,7 @@ struct pcmcia_socket {
|
||||||
struct list_head socket_list;
|
struct list_head socket_list;
|
||||||
struct completion socket_released;
|
struct completion socket_released;
|
||||||
|
|
||||||
/* deprecated */
|
/* deprecated */
|
||||||
unsigned int sock; /* socket number */
|
unsigned int sock; /* socket number */
|
||||||
|
|
||||||
|
|
||||||
|
@ -164,7 +164,7 @@ struct pcmcia_socket {
|
||||||
u_int map_size;
|
u_int map_size;
|
||||||
u_int io_offset;
|
u_int io_offset;
|
||||||
u_int pci_irq;
|
u_int pci_irq;
|
||||||
struct pci_dev * cb_dev;
|
struct pci_dev *cb_dev;
|
||||||
|
|
||||||
|
|
||||||
/* socket setup is done so resources should be able to be allocated.
|
/* socket setup is done so resources should be able to be allocated.
|
||||||
|
@ -179,9 +179,9 @@ struct pcmcia_socket {
|
||||||
u8 reserved:5;
|
u8 reserved:5;
|
||||||
|
|
||||||
/* socket operations */
|
/* socket operations */
|
||||||
struct pccard_operations * ops;
|
struct pccard_operations *ops;
|
||||||
struct pccard_resource_ops * resource_ops;
|
struct pccard_resource_ops *resource_ops;
|
||||||
void * resource_data;
|
void *resource_data;
|
||||||
|
|
||||||
/* Zoom video behaviour is so chip specific its not worth adding
|
/* Zoom video behaviour is so chip specific its not worth adding
|
||||||
this to _ops */
|
this to _ops */
|
||||||
|
@ -245,7 +245,7 @@ struct pcmcia_socket {
|
||||||
|
|
||||||
/* cardbus (32-bit) */
|
/* cardbus (32-bit) */
|
||||||
#ifdef CONFIG_CARDBUS
|
#ifdef CONFIG_CARDBUS
|
||||||
struct resource * cb_cis_res;
|
struct resource *cb_cis_res;
|
||||||
void __iomem *cb_cis_virt;
|
void __iomem *cb_cis_virt;
|
||||||
#endif /* CONFIG_CARDBUS */
|
#endif /* CONFIG_CARDBUS */
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue