Module Name: src Committed By: hauke Date: Thu May 13 08:47:21 UTC 2021
Modified Files: src/sys/arch/mac68k/obio: iwm_fd.c Log Message: We do not match machines whose SWIM does not support the IWM register set used by this driver (SWIM II/III, SWIM behind IOP, AV models' DMA based controllers). Unfortunately, this distinction does not run cleanly along MACH_CLASS* lines, and we have to look at MACH_MAC{model} tags. To generate a diff of this commit: cvs rdiff -u -r1.59 -r1.60 src/sys/arch/mac68k/obio/iwm_fd.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/mac68k/obio/iwm_fd.c diff -u src/sys/arch/mac68k/obio/iwm_fd.c:1.59 src/sys/arch/mac68k/obio/iwm_fd.c:1.60 --- src/sys/arch/mac68k/obio/iwm_fd.c:1.59 Sat Apr 24 23:36:41 2021 +++ src/sys/arch/mac68k/obio/iwm_fd.c Thu May 13 08:47:21 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: iwm_fd.c,v 1.59 2021/04/24 23:36:41 thorpej Exp $ */ +/* $NetBSD: iwm_fd.c,v 1.60 2021/05/13 08:47:21 hauke Exp $ */ /* * Copyright (c) 1997, 1998 Hauke Fath. All rights reserved. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: iwm_fd.c,v 1.59 2021/04/24 23:36:41 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: iwm_fd.c,v 1.60 2021/05/13 08:47:21 hauke Exp $"); #include "locators.h" @@ -65,11 +65,6 @@ __KERNEL_RCSID(0, "$NetBSD: iwm_fd.c,v 1 #include <mac68k/obio/iwmreg.h> #include <mac68k/obio/iwm_fdvar.h> -/** - ** Private functions - **/ -static int map_iwm_base(vm_offset_t); - /* Autoconfig */ int iwm_match(device_t, cfdata_t, void *); void iwm_attach(device_t, device_t, void *); @@ -78,6 +73,10 @@ int fd_match(device_t, cfdata_t, void *) void fd_attach(device_t, device_t, void *); int fd_print(void *, const char *); +/** + ** Private functions + **/ + /* Disklabel stuff */ static void fdGetDiskLabel(fd_softc_t *, dev_t); static void fdPrintDiskLabel(struct disklabel *); @@ -164,7 +163,7 @@ int iwmDebugging = 0 /* | M_TRACE_OP ** Module-global Variables **/ -/* The IWM base address */ +/* The controller base address */ u_long IWMBase; /* @@ -273,30 +272,71 @@ struct dkdriver fd_dkDriver = { * to match against. After all, that's what the obio concept is * about: Onboard components that are present depending (only) * on machine type. + * + * While here, map the machine-dependent physical IO address of IWM + * to VM address. + * + * We do not match, nor return an IWMBase address for machines whose + * SWIM does not support the IWM register set used by this driver + * (SWIM II/III, SWIM behind IOP, AV models' DMA based controllers). + * Unfortunately, this distinction does not run cleanly along + * MACH_CLASS* lines, and we will have to look at MACH_MAC{model} tags. + * + * See also "What chips are in what Macs?" at + * <http://bitsavers.org/pdf/apple/mac/mess/Mac_Technical_Notes.html>, */ int iwm_match(device_t parent, cfdata_t match, void *aux) { - int matched; + int matched = 0; extern u_long IOBase; /* from mac68k/machdep.c */ extern u_long IWMBase; - - if (0 == map_iwm_base(IOBase)) { - /* - * Unknown machine HW: - * The SWIM II/III chips that are present in post-Q700 - * '040 Macs have dropped the IWM register structure. - * We know next to nothing about the SWIM. - */ - matched = 0; - if (TRACE_CONFIG) - printf("IWM or SWIM not found: Unknown location (SWIM II?).\n"); - } else { + + IWMBase = 0L; + + switch (current_mac_model->class) { + case MACH_CLASSPB: /* Not: 5x0, 190x */ + if (current_mac_model->machineid == MACH_MACPB500 || + current_mac_model->machineid == MACH_MACPB190 || + current_mac_model->machineid == MACH_MACPB190CS) + break; + /* FALLTHROUGH */ + case MACH_CLASSLC: /* Only: LC II, Classic II */ + if (current_mac_model->machineid != MACH_MACLCII && + current_mac_model->machineid != MACH_MACCLASSICII) + break; + /* FALLTHROUGH */ + case MACH_CLASSII: /* All */ + case MACH_CLASSIIci: /* All */ + case MACH_CLASSIIsi: /* All */ + case MACH_CLASSIIvx: /* All */ + case MACH_CLASSDUO: /* All */ + IWMBase = IOBase + 0x16000; matched = 1; - if (TRACE_CONFIG) { - printf("iwm: IWMBase mapped to 0x%lx in VM.\n", - IWMBase); + break; + case MACH_CLASSQ: /* Only: 700 */ + if (current_mac_model->machineid == MACH_MACQ700) { + IWMBase = IOBase + 0x1E000; + matched = 1; + break; } + /* FALLTHROUGH */ + case MACH_CLASSQ2: /* None */ + case MACH_CLASSP580: /* None */ + case MACH_CLASSIIfx: /* None */ + case MACH_CLASSAV: /* None */ + default: + IWMBase = 0L; + matched = 0; + break; + } + + if (TRACE_CONFIG) { + if (matched == 0) + printf("IWM or original SWIM not found.\n"); + else + printf("IWMBase mapped to VM addr 0x%lx.\n", + IWMBase); } return matched; } @@ -337,7 +377,7 @@ iwm_attach(device_t parent, device_t sel if (TRACE_CONFIG) printf("iwm: Initialization completed.\n"); } else { - printf("iwm: Chip revision not supported (%d)\n", iwmErr); + printf("iwm: Initialization failed (%d)\n", iwmErr); } } @@ -356,50 +396,6 @@ iwm_print(void *aux, const char *control } -/* - * map_iwm_base - * - * Map physical IO address of IWM to VM address - */ -static int -map_iwm_base(vm_offset_t base) -{ - int known; - extern u_long IWMBase; - - switch (current_mac_model->class) { - case MACH_CLASSQ: - case MACH_CLASSQ2: - case MACH_CLASSP580: - IWMBase = base + 0x1E000; - known = 1; - break; - case MACH_CLASSII: - case MACH_CLASSPB: - case MACH_CLASSDUO: - case MACH_CLASSIIci: - case MACH_CLASSIIsi: - case MACH_CLASSIIvx: - case MACH_CLASSLC: - IWMBase = base + 0x16000; - known = 1; - break; - case MACH_CLASSIIfx: - case MACH_CLASSAV: - default: - /* - * Neither IIfx/Q9[05]0 style IOP controllers nor - * Q[68]40AV DMA based controllers are supported. - */ - if (TRACE_CONFIG) - printf("Unknown floppy controller chip.\n"); - IWMBase = 0L; - known = 0; - break; - } - return known; -} - /*** Configure Sony disk drive(s) ***/ @@ -1504,9 +1500,9 @@ remap_geometry(daddr_t block, int heads, int zone, spt; extern diskZone_t diskZones[]; - spt = 0; /* XXX Shut up egcs warning */ loc->oldTrack = loc->track; loc->track = 0; + spt = 0; for (zone = 0; zone < IWM_GCR_DISK_ZONES; zone++) { if (block >= heads * (diskZones[zone].lastBlock + 1)) {