static int check_ide_device(int slot, int ide_base_bus) { volatile uchar *ident = NULL; volatile uchar *feature_p[MAX_FEATURES]; volatile uchar *p, *start; int n_features = 0; uchar func_id = ~0; uchar code, len; ushort config_base = 0; int found = 0; int i; u32 socket_status; debug ("PCMCIA MEM: %08X\n", pcmcia_cis_ptr); socket_status = readl(socket_base+8); if ((socket_status & 6) != 0 || (socket_status & 0x20) != 0) { printf("no card or CardBus card\n"); return 1; } start = p = (volatile uchar *) pcmcia_cis_ptr; while ((p - start) < MAX_TUPEL_SZ) { code = *p; p += 2; if (code == 0xFF) { /* End of chain */ break; } len = *p; p += 2; #if defined(DEBUG) && (DEBUG > 1) { volatile uchar *q = p; printf ("\nTuple code %02x length %d\n\tData:", code, len); for (i = 0; i < len; ++i) { printf (" %02x", *q); q+= 2; } } #endif /* DEBUG */ switch (code) { case CISTPL_VERS_1: ident = p + 4; break; case CISTPL_FUNCID: /* Fix for broken SanDisk which may have 0x80 bit set */ func_id = *p & 0x7F; break; case CISTPL_FUNCE: if (n_features < MAX_FEATURES) feature_p[n_features++] = p; break; case CISTPL_CONFIG: config_base = (*(p+6) << 8) + (*(p+4)); debug ("\n## Config_base = %04x ###\n", config_base); default: break; } p += 2 * len; } found = identify(ident); if (func_id != ((uchar)~0)) { print_funcid (func_id); if (func_id == CISTPL_FUNCID_FIXED) found = 1; else return 1; /* no disk drive */ } for (i=0; i<n_features; ++i) { print_fixed(feature_p[i]); } if (!found) { printf("unknown card type\n"); return 1; } /* select config index 1 */ writeb(1, pcmcia_cis_ptr + config_base); #if 0 printf("Confiuration Option Register: %02x\n", readb(pcmcia_cis_ptr + config_base)); printf("Card Confiuration and Status Register: %02x\n", readb(pcmcia_cis_ptr + config_base + 2)); printf("Pin Replacement Register Register: %02x\n", readb(pcmcia_cis_ptr + config_base + 4)); printf("Socket and Copy Register: %02x\n", readb(pcmcia_cis_ptr + config_base + 6)); #endif ide_devices_found |= (1 << (slot+ide_base_bus)); return 0; }
int check_ide_device (int slot) { volatile uchar *ident = NULL; volatile uchar *feature_p[MAX_FEATURES]; volatile uchar *p, *start, *addr; int n_features = 0; uchar func_id = ~0; uchar code, len; ushort config_base = 0; int found = 0; int i; addr = (volatile uchar *)(CONFIG_SYS_PCMCIA_MEM_ADDR + CONFIG_SYS_PCMCIA_MEM_SIZE * (slot * 4)); debug ("PCMCIA MEM: %08lX\n", (ulong)addr); start = p = (volatile uchar *) addr; while ((p - start) < MAX_TUPEL_SZ) { code = *p; p += 2; if (code == 0xFF) { /* End of chain */ break; } len = *p; p += 2; #if defined(DEBUG) && (DEBUG > 1) { volatile uchar *q = p; printf ("\nTuple code %02x length %d\n\tData:", code, len); for (i = 0; i < len; ++i) { printf (" %02x", *q); q+= 2; } } #endif /* DEBUG */ switch (code) { case CISTPL_VERS_1: ident = p + 4; break; case CISTPL_FUNCID: /* Fix for broken SanDisk which may have 0x80 bit set */ func_id = *p & 0x7F; break; case CISTPL_FUNCE: if (n_features < MAX_FEATURES) feature_p[n_features++] = p; break; case CISTPL_CONFIG: config_base = (*(p+6) << 8) + (*(p+4)); debug ("\n## Config_base = %04x ###\n", config_base); default: break; } p += 2 * len; } found = identify (ident); if (func_id != ((uchar)~0)) { print_funcid (func_id); if (func_id == CISTPL_FUNCID_FIXED) found = 1; else return (1); /* no disk drive */ } for (i=0; i<n_features; ++i) { print_fixed (feature_p[i]); } if (!found) { printf ("unknown card type\n"); return (1); } ide_devices_found |= (1 << slot); /* set I/O area in config reg -> only valid for ARGOSY D5!!! */ *((uchar *)(addr + config_base)) = 1; #if 0 printf("\n## Config_base = %04x ###\n", config_base); printf("Configuration Option Register: %02x @ %x\n", readb(addr + config_base), addr + config_base); printf("Card Configuration and Status Register: %02x\n", readb(addr + config_base + 2)); printf("Pin Replacement Register Register: %02x\n", readb(addr + config_base + 4)); printf("Socket and Copy Register: %02x\n", readb(addr + config_base + 6)); #endif return (0); }
static int check_ide_device (void) { volatile uchar *ident = NULL; volatile uchar *feature_p[MAX_FEATURES]; volatile uchar *p, *start; int n_features = 0; uchar func_id = ~0; uchar code, len; ushort config_base = 0; int found = 0; int i; PCMCIA_DEBUG ("PCMCIA MEM: %08X\n", CFG_PCMCIA_MEM_ADDR); start = p = (volatile uchar *) CFG_PCMCIA_MEM_ADDR; while ((p - start) < MAX_TUPEL_SZ) { code = *p; p += 2; if (code == 0xFF) { /* End of chain */ break; } len = *p; p += 2; #ifdef DEBUG { volatile uchar *q = p; printf ("\nTuple code %02x length %d\n\tData:", code, len); for (i = 0; i < len; ++i) { printf (" %02x", *q); q+= 2; } } #endif /* DEBUG */ switch (code) { case CISTPL_VERS_1: ident = p + 4; break; case CISTPL_FUNCID: func_id = *p; break; case CISTPL_FUNCE: if (n_features < MAX_FEATURES) feature_p[n_features++] = p; break; case CISTPL_CONFIG: config_base = (*(p+6) << 8) + (*(p+4)); PCMCIA_DEBUG ("\n## Config_base = %04x ###\n", config_base); default: break; } p += 2 * len; } found = identify (ident); if (func_id != ((uchar)~0)) { print_funcid (func_id); if (func_id == CISTPL_FUNCID_FIXED) found = 1; else return (1); /* no disk drive */ } for (i=0; i<n_features; ++i) { print_fixed (feature_p[i]); } if (!found) { printf ("unknown card type\n"); return (1); } /* set I/O area in config reg -> only valid for ARGOSY D5!!! */ //*((uchar *)(CFG_PCMCIA_MEM_ADDR + config_base)) = 1; return (0); }