static void validate_mem(struct pcmcia_socket *s, unsigned int probe_mask) { struct resource_map *m, mm; struct socket_data *s_data = s->resource_data; for (m = s_data->mem_db.next; m != &s_data->mem_db; m = mm.next) { mm = *m; do_mem_probe(mm.base, mm.num, s); } }
static int validate_mem(struct pcmcia_socket *s, unsigned int probe_mask) { struct resource_map *m, mm; static unsigned char order[] = { 0xd0, 0xe0, 0xc0, 0xf0 }; unsigned long b, i, ok = 0; struct socket_data *s_data = s->resource_data; /* We do up to four passes through the list */ if (probe_mask & MEM_PROBE_HIGH) { if (inv_probe(s_data->mem_db.next, s) > 0) return 0; dev_printk(KERN_NOTICE, &s->dev, "cs: warning: no high memory space available!\n"); return -ENODEV; } for (m = s_data->mem_db.next; m != &s_data->mem_db; m = mm.next) { mm = *m; /* Only probe < 1 MB */ if (mm.base >= 0x100000) continue; if ((mm.base | mm.num) & 0xffff) { ok += do_mem_probe(mm.base, mm.num, s); continue; } /* Special probe for 64K-aligned block */ for (i = 0; i < 4; i++) { b = order[i] << 12; if ((b >= mm.base) && (b+0x10000 <= mm.base+mm.num)) { if (ok >= mem_limit) sub_interval(&s_data->mem_db, b, 0x10000); else ok += do_mem_probe(b, 0x10000, s); } } } if (ok > 0) return 0; return -ENODEV; }
void validate_mem(int (*is_valid)(u_long), int (*do_cksum)(u_long), int force_low, socket_info_t *s) { resource_map_t *m; static int done = 0; if (!probe_mem || done++) return; for (m = mem_db.next; m != &mem_db; m = m->next) if (do_mem_probe(m->base, m->num, is_valid, do_cksum, s)) return; }
static int validate_mem(struct pcmcia_socket *s, unsigned int probe_mask) { struct resource_map *m, mm; struct socket_data *s_data = s->resource_data; unsigned long ok = 0; for (m = s_data->mem_db.next; m != &s_data->mem_db; m = mm.next) { mm = *m; ok += do_mem_probe(mm.base, mm.num, s); } if (ok > 0) return 0; return -ENODEV; }
void validate_mem(int (*is_valid)(u_long), int (*do_cksum)(u_long), int force_low, socket_info_t *s) { resource_map_t *m, *n; static u_char order[] = { 0xd0, 0xe0, 0xc0, 0xf0 }; static int hi = 0, lo = 0; u_long b, i, ok = 0; if (!probe_mem) return; /* We do up to four passes through the list */ if (!force_low) { if (hi++ || (inv_probe(is_valid, do_cksum, mem_db.next, s) > 0)) return; printk(KERN_NOTICE "cs: warning: no high memory space " "available!\n"); } if (lo++) return; for (m = mem_db.next; m != &mem_db; m = n) { n = m->next; /* Only probe < 1 MB */ if (m->base >= 0x100000) continue; if ((m->base | m->num) & 0xffff) { ok += do_mem_probe(m->base, m->num, is_valid, do_cksum, s); continue; } /* Special probe for 64K-aligned block */ for (i = 0; i < 4; i++) { b = order[i] << 12; if ((b >= m->base) && (b+0x10000 <= m->base+m->num)) { if (ok >= mem_limit) sub_interval(&mem_db, b, 0x10000); else ok += do_mem_probe(b, 0x10000, is_valid, do_cksum, s); } } } }
static u_long inv_probe(struct resource_map *m, struct pcmcia_socket *s) { struct socket_data *s_data = s->resource_data; u_long ok; if (m == &s_data->mem_db) return 0; ok = inv_probe(m->next, s); if (ok) { if (m->base >= 0x100000) sub_interval(&s_data->mem_db, m->base, m->num); return ok; } if (m->base < 0x100000) return 0; return do_mem_probe(m->base, m->num, s); }
static u_long inv_probe(int (*is_valid)(u_long), int (*do_cksum)(u_long), resource_map_t *m) { u_long ok; if (m == &mem_db) return 0; ok = inv_probe(is_valid, do_cksum, m->next); if (ok) { if (m->base >= 0x100000) sub_interval(&mem_db, m->base, m->num); return ok; } if (m->base < 0x100000) return 0; return do_mem_probe(m->base, m->num, is_valid, do_cksum); }