Hardware/LPC/LPCIO.cs
changeset 167 b7cc9d09aefe
parent 166 fa9dfbfc4145
child 169 3b2bcba8c02d
     1.1 --- a/Hardware/LPC/LPCIO.cs	Thu Aug 12 20:53:27 2010 +0000
     1.2 +++ b/Hardware/LPC/LPCIO.cs	Sun Aug 15 14:46:58 2010 +0000
     1.3 @@ -47,8 +47,6 @@
     1.4      private List<ISuperIO> superIOs = new List<ISuperIO>();
     1.5      private StringBuilder report = new StringBuilder();
     1.6  
     1.7 -    private Chip chip = Chip.Unknown;
     1.8 -
     1.9      // I/O Ports
    1.10      private ushort[] REGISTER_PORTS = new ushort[] { 0x2e, 0x4e };
    1.11      private ushort[] VALUE_PORTS = new ushort[] { 0x2f, 0x4f };
    1.12 @@ -121,261 +119,290 @@
    1.13        WinRing0.WriteIoPortByte(registerPort, 0xAA);
    1.14      }
    1.15  
    1.16 +    private void ReportUnknownChip(string type, int chip) {
    1.17 +      report.Append("Chip ID: Unknown ");
    1.18 +      report.Append(type);
    1.19 +      report.Append(" with ID 0x");
    1.20 +      report.Append(chip.ToString("X", CultureInfo.InvariantCulture));
    1.21 +      report.Append(" at 0x");
    1.22 +      report.Append(registerPort.ToString("X", CultureInfo.InvariantCulture));
    1.23 +      report.Append("/0x");
    1.24 +      report.AppendLine(valuePort.ToString("X", CultureInfo.InvariantCulture));
    1.25 +      report.AppendLine();
    1.26 +    }
    1.27 +
    1.28 +    private bool DetectWinbondFintek() {
    1.29 +      WinbondFintekEnter();
    1.30 +
    1.31 +      byte logicalDeviceNumber;
    1.32 +      byte id = ReadByte(CHIP_ID_REGISTER);
    1.33 +      byte revision = ReadByte(CHIP_REVISION_REGISTER);
    1.34 +      Chip chip = Chip.Unknown;
    1.35 +      logicalDeviceNumber = 0;
    1.36 +      switch (id) {
    1.37 +        case 0x05:
    1.38 +          switch (revision) {
    1.39 +            case 0x07:
    1.40 +              chip = Chip.F71858;
    1.41 +              logicalDeviceNumber = F71858_HARDWARE_MONITOR_LDN;
    1.42 +              break;
    1.43 +            case 0x41:
    1.44 +              chip = Chip.F71882;
    1.45 +              logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
    1.46 +              break;
    1.47 +          } break;
    1.48 +        case 0x06:
    1.49 +          switch (revision) {
    1.50 +            case 0x01:
    1.51 +              chip = Chip.F71862;
    1.52 +              logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
    1.53 +              break;
    1.54 +          } break;
    1.55 +        case 0x07:
    1.56 +          switch (revision) {
    1.57 +            case 0x23:
    1.58 +              chip = Chip.F71889F;
    1.59 +              logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
    1.60 +              break;
    1.61 +          } break;
    1.62 +        case 0x08:
    1.63 +          switch (revision) {
    1.64 +            case 0x14:
    1.65 +              chip = Chip.F71869;
    1.66 +              logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
    1.67 +              break;
    1.68 +          } break;
    1.69 +        case 0x09:
    1.70 +          switch (revision) {
    1.71 +            case 0x09:
    1.72 +              chip = Chip.F71889ED;
    1.73 +              logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
    1.74 +              break;
    1.75 +          } break;
    1.76 +        case 0x52:
    1.77 +          switch (revision) {
    1.78 +            case 0x17:
    1.79 +            case 0x3A:
    1.80 +            case 0x41:
    1.81 +              chip = Chip.W83627HF;
    1.82 +              logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
    1.83 +              break;
    1.84 +          } break;
    1.85 +        case 0x82:
    1.86 +          switch (revision & 0xF0) {
    1.87 +            case 0x80:
    1.88 +              chip = Chip.W83627THF;
    1.89 +              logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
    1.90 +              break;
    1.91 +          } break;
    1.92 +        case 0x85:
    1.93 +          switch (revision) {
    1.94 +            case 0x41:
    1.95 +              chip = Chip.W83687THF;
    1.96 +              logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
    1.97 +              break;
    1.98 +          } break;
    1.99 +        case 0x88:
   1.100 +          switch (revision & 0xF0) {
   1.101 +            case 0x50:
   1.102 +            case 0x60:
   1.103 +              chip = Chip.W83627EHF;
   1.104 +              logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
   1.105 +              break;
   1.106 +          } break;
   1.107 +        case 0xA0:
   1.108 +          switch (revision & 0xF0) {
   1.109 +            case 0x20:
   1.110 +              chip = Chip.W83627DHG;
   1.111 +              logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
   1.112 +              break;
   1.113 +          } break;
   1.114 +        case 0xA5:
   1.115 +          switch (revision & 0xF0) {
   1.116 +            case 0x10:
   1.117 +              chip = Chip.W83667HG;
   1.118 +              logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
   1.119 +              break;
   1.120 +          } break;
   1.121 +        case 0xB0:
   1.122 +          switch (revision & 0xF0) {
   1.123 +            case 0x70:
   1.124 +              chip = Chip.W83627DHGP;
   1.125 +              logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
   1.126 +              break;
   1.127 +          } break;
   1.128 +        case 0xB3:
   1.129 +          switch (revision & 0xF0) {
   1.130 +            case 0x50:
   1.131 +              chip = Chip.W83667HGB;
   1.132 +              logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
   1.133 +              break;
   1.134 +          } break;
   1.135 +      }
   1.136 +      if (chip == Chip.Unknown) {
   1.137 +        if (id != 0 && id != 0xff) {
   1.138 +          WinbondFintekExit();
   1.139 +
   1.140 +          ReportUnknownChip("Winbond / Fintek", ((id << 8) | revision));         
   1.141 +        }
   1.142 +      } else {
   1.143 +
   1.144 +        Select(logicalDeviceNumber);
   1.145 +        ushort address = ReadWord(BASE_ADDRESS_REGISTER);
   1.146 +        Thread.Sleep(1);
   1.147 +        ushort verify = ReadWord(BASE_ADDRESS_REGISTER);
   1.148 +
   1.149 +        ushort vendorID = ReadWord(FINTEK_VENDOR_ID_REGISTER);
   1.150 +
   1.151 +        WinbondFintekExit();
   1.152 +
   1.153 +        if (address != verify) {
   1.154 +          report.Append("Chip ID: 0x");
   1.155 +          report.AppendLine(chip.ToString("X"));
   1.156 +          report.Append("Chip revision: 0x");
   1.157 +          report.AppendLine(revision.ToString("X", 
   1.158 +            CultureInfo.InvariantCulture));
   1.159 +          report.AppendLine("Error: Address verification failed");
   1.160 +          report.AppendLine();
   1.161 +          return false;
   1.162 +        }
   1.163 +
   1.164 +        // some Fintek chips have address register offset 0x05 added already
   1.165 +        if ((address & 0x07) == 0x05)
   1.166 +          address &= 0xFFF8;
   1.167 +
   1.168 +        if (address < 0x100 || (address & 0xF007) != 0) {
   1.169 +          report.Append("Chip ID: 0x");
   1.170 +          report.AppendLine(chip.ToString("X"));
   1.171 +          report.Append("Chip revision: 0x");
   1.172 +          report.AppendLine(revision.ToString("X", 
   1.173 +            CultureInfo.InvariantCulture));
   1.174 +          report.Append("Error: Invalid address 0x");
   1.175 +          report.AppendLine(address.ToString("X", 
   1.176 +            CultureInfo.InvariantCulture));
   1.177 +          report.AppendLine();
   1.178 +          return false;
   1.179 +        }
   1.180 +
   1.181 +        switch (chip) {
   1.182 +          case Chip.W83627DHG:
   1.183 +          case Chip.W83627DHGP:
   1.184 +          case Chip.W83627EHF:
   1.185 +          case Chip.W83627HF:
   1.186 +          case Chip.W83627THF:
   1.187 +          case Chip.W83667HG:
   1.188 +          case Chip.W83667HGB:
   1.189 +          case Chip.W83687THF:
   1.190 +            superIOs.Add(new W836XX(chip, revision, address));
   1.191 +            break;
   1.192 +          case Chip.F71858:
   1.193 +          case Chip.F71862:
   1.194 +          case Chip.F71869:
   1.195 +          case Chip.F71882:
   1.196 +          case Chip.F71889ED:
   1.197 +          case Chip.F71889F:
   1.198 +            if (vendorID != FINTEK_VENDOR_ID) {
   1.199 +              report.Append("Chip ID: 0x");
   1.200 +              report.AppendLine(chip.ToString("X"));
   1.201 +              report.Append("Chip revision: 0x");
   1.202 +              report.AppendLine(revision.ToString("X", 
   1.203 +                CultureInfo.InvariantCulture));
   1.204 +              report.Append("Error: Invalid vendor ID 0x");
   1.205 +              report.AppendLine(vendorID.ToString("X", 
   1.206 +                CultureInfo.InvariantCulture));
   1.207 +              report.AppendLine();
   1.208 +              return false;
   1.209 +            }
   1.210 +            superIOs.Add(new F718XX(chip, address));
   1.211 +            break;
   1.212 +          default: break;
   1.213 +        }
   1.214 +
   1.215 +        return true;
   1.216 +      }
   1.217 +
   1.218 +      return false;
   1.219 +    }
   1.220 +
   1.221 +    private bool DetectIT87() {
   1.222 +      IT87Enter();
   1.223 +
   1.224 +      ushort chipID = ReadWord(CHIP_ID_REGISTER);
   1.225 +      Chip chip;
   1.226 +      switch (chipID) {
   1.227 +        case 0x8712: chip = Chip.IT8712F; break;
   1.228 +        case 0x8716: chip = Chip.IT8716F; break;
   1.229 +        case 0x8718: chip = Chip.IT8718F; break;
   1.230 +        case 0x8720: chip = Chip.IT8720F; break;
   1.231 +        case 0x8726: chip = Chip.IT8726F; break;
   1.232 +        default: chip = Chip.Unknown; break;
   1.233 +      }
   1.234 +      if (chip == Chip.Unknown) {
   1.235 +        if (chipID != 0 && chipID != 0xffff) {
   1.236 +          IT87Exit();
   1.237 +
   1.238 +          ReportUnknownChip("ITE", chipID);
   1.239 +        }
   1.240 +      } else {
   1.241 +        Select(IT87_ENVIRONMENT_CONTROLLER_LDN);
   1.242 +        ushort address = ReadWord(BASE_ADDRESS_REGISTER);
   1.243 +        Thread.Sleep(1);
   1.244 +        ushort verify = ReadWord(BASE_ADDRESS_REGISTER);
   1.245 +
   1.246 +        byte version = (byte)(ReadByte(IT87_CHIP_VERSION_REGISTER) & 0x0F);
   1.247 +
   1.248 +        IT87Exit();
   1.249 +
   1.250 +        if (address != verify || address < 0x100 || (address & 0xF007) != 0) {
   1.251 +          report.Append("Chip ID: 0x");
   1.252 +          report.AppendLine(chip.ToString("X"));
   1.253 +          report.Append("Error: Invalid address 0x");
   1.254 +          report.AppendLine(address.ToString("X",
   1.255 +            CultureInfo.InvariantCulture));
   1.256 +          report.AppendLine();
   1.257 +          return false;
   1.258 +        }
   1.259 +
   1.260 +        superIOs.Add(new IT87XX(chip, address, version));
   1.261 +        return true;
   1.262 +      }
   1.263 +
   1.264 +      return false;
   1.265 +    }
   1.266 +
   1.267 +    private bool DetectSMSC() {
   1.268 +      SMSCEnter();
   1.269 +
   1.270 +      ushort chipID = ReadWord(CHIP_ID_REGISTER);
   1.271 +      Chip chip;
   1.272 +      switch (chipID) {
   1.273 +        default: chip = Chip.Unknown; break;
   1.274 +      }
   1.275 +      if (chip == Chip.Unknown) {
   1.276 +        if (chipID != 0 && chipID != 0xffff) {
   1.277 +          SMSCExit();
   1.278 +
   1.279 +          ReportUnknownChip("SMSC", chipID);
   1.280 +        }
   1.281 +      } else {
   1.282 +        SMSCExit();
   1.283 +        return true;
   1.284 +      }
   1.285 +
   1.286 +      return false;
   1.287 +    }
   1.288 +
   1.289      private void Detect() {
   1.290  
   1.291        for (int i = 0; i < REGISTER_PORTS.Length; i++) {
   1.292          registerPort = REGISTER_PORTS[i];
   1.293          valuePort = VALUE_PORTS[i];
   1.294  
   1.295 -        WinbondFintekEnter();
   1.296 +        if (DetectWinbondFintek()) continue;
   1.297  
   1.298 -        byte logicalDeviceNumber;
   1.299 -        byte id = ReadByte(CHIP_ID_REGISTER);
   1.300 -        byte revision = ReadByte(CHIP_REVISION_REGISTER);
   1.301 -        chip = Chip.Unknown;
   1.302 -        logicalDeviceNumber = 0;
   1.303 -        switch (id) {
   1.304 -          case 0x05:
   1.305 -            switch (revision) {
   1.306 -              case 0x07:
   1.307 -                chip = Chip.F71858;
   1.308 -                logicalDeviceNumber = F71858_HARDWARE_MONITOR_LDN;
   1.309 -                break;
   1.310 -              case 0x41:
   1.311 -                chip = Chip.F71882;
   1.312 -                logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
   1.313 -                break;
   1.314 -            } break;
   1.315 -          case 0x06:
   1.316 -            switch (revision) {
   1.317 -              case 0x01:
   1.318 -                chip = Chip.F71862;
   1.319 -                logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
   1.320 -                break;
   1.321 -            } break;
   1.322 -          case 0x07:
   1.323 -            switch (revision) {
   1.324 -              case 0x23:
   1.325 -                chip = Chip.F71889F;
   1.326 -                logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
   1.327 -                break;
   1.328 -            } break;
   1.329 -          case 0x08:
   1.330 -            switch (revision) {
   1.331 -              case 0x14:
   1.332 -                chip = Chip.F71869;
   1.333 -                logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
   1.334 -                break;
   1.335 -            } break;
   1.336 -          case 0x09:
   1.337 -            switch (revision) {
   1.338 -              case 0x09:
   1.339 -                chip = Chip.F71889ED;
   1.340 -                logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
   1.341 -                break;
   1.342 -            } break;
   1.343 -          case 0x52:
   1.344 -            switch (revision) {
   1.345 -              case 0x17:
   1.346 -              case 0x3A:
   1.347 -              case 0x41:
   1.348 -                chip = Chip.W83627HF;
   1.349 -                logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
   1.350 -                break;
   1.351 -            } break;
   1.352 -          case 0x82:
   1.353 -            switch (revision & 0xF0) {
   1.354 -              case 0x80:
   1.355 -                chip = Chip.W83627THF;
   1.356 -                logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
   1.357 -                break;
   1.358 -            } break;
   1.359 -          case 0x85:
   1.360 -            switch (revision) {
   1.361 -              case 0x41:
   1.362 -                chip = Chip.W83687THF;
   1.363 -                logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
   1.364 -                break;
   1.365 -            } break;
   1.366 -          case 0x88:
   1.367 -            switch (revision & 0xF0) {
   1.368 -              case 0x50:
   1.369 -              case 0x60:
   1.370 -                chip = Chip.W83627EHF;
   1.371 -                logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
   1.372 -                break;
   1.373 -            } break;
   1.374 -          case 0xA0:
   1.375 -            switch (revision & 0xF0) {
   1.376 -              case 0x20:
   1.377 -                chip = Chip.W83627DHG;
   1.378 -                logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
   1.379 -                break;
   1.380 -            } break;
   1.381 -          case 0xA5:
   1.382 -            switch (revision & 0xF0) {
   1.383 -              case 0x10:
   1.384 -                chip = Chip.W83667HG;
   1.385 -                logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
   1.386 -                break;
   1.387 -            } break;
   1.388 -          case 0xB0:
   1.389 -            switch (revision & 0xF0) {
   1.390 -              case 0x70:
   1.391 -                chip = Chip.W83627DHGP;
   1.392 -                logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
   1.393 -                break;
   1.394 -            } break;
   1.395 -          case 0xB3:
   1.396 -            switch (revision & 0xF0) {
   1.397 -              case 0x50:
   1.398 -                chip = Chip.W83667HGB;
   1.399 -                logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
   1.400 -                break;
   1.401 -            } break;
   1.402 -        }
   1.403 -        if (chip == Chip.Unknown) {
   1.404 -          if (id != 0 && id != 0xff) {
   1.405 -            WinbondFintekExit();
   1.406 +        if (DetectIT87()) continue;
   1.407  
   1.408 -            report.Append("Chip ID: Unknown Winbond / Fintek with ID 0x");
   1.409 -            report.AppendLine(((id << 8) | revision).ToString("X", 
   1.410 -              CultureInfo.InvariantCulture));
   1.411 -            report.AppendLine();
   1.412 -          }
   1.413 -        } else {
   1.414 -
   1.415 -          Select(logicalDeviceNumber);
   1.416 -          ushort address = ReadWord(BASE_ADDRESS_REGISTER);
   1.417 -          Thread.Sleep(1);
   1.418 -          ushort verify = ReadWord(BASE_ADDRESS_REGISTER);
   1.419 -
   1.420 -          ushort vendorID = ReadWord(FINTEK_VENDOR_ID_REGISTER);
   1.421 -
   1.422 -          WinbondFintekExit();
   1.423 -
   1.424 -          if (address != verify) {
   1.425 -            report.Append("Chip ID: 0x");
   1.426 -            report.AppendLine(chip.ToString("X"));
   1.427 -            report.Append("Chip revision: 0x");
   1.428 -            report.AppendLine(revision.ToString("X", CultureInfo.InvariantCulture));
   1.429 -            report.AppendLine("Error: Address verification failed");
   1.430 -            report.AppendLine();
   1.431 -            return;
   1.432 -          }
   1.433 -
   1.434 -          // some Fintek chips have address register offset 0x05 added already
   1.435 -          if ((address & 0x07) == 0x05)
   1.436 -            address &= 0xFFF8;
   1.437 -
   1.438 -          if (address < 0x100 || (address & 0xF007) != 0) {
   1.439 -            report.Append("Chip ID: 0x");
   1.440 -            report.AppendLine(chip.ToString("X"));
   1.441 -            report.Append("Chip revision: 0x");
   1.442 -            report.AppendLine(revision.ToString("X", CultureInfo.InvariantCulture));
   1.443 -            report.Append("Error: Invalid address 0x");
   1.444 -            report.AppendLine(address.ToString("X", CultureInfo.InvariantCulture));
   1.445 -            report.AppendLine();
   1.446 -            return;
   1.447 -          }
   1.448 -
   1.449 -          switch (chip) {
   1.450 -            case Chip.W83627DHG:
   1.451 -            case Chip.W83627DHGP:
   1.452 -            case Chip.W83627EHF:
   1.453 -            case Chip.W83627HF:
   1.454 -            case Chip.W83627THF:
   1.455 -            case Chip.W83667HG:
   1.456 -            case Chip.W83667HGB:
   1.457 -            case Chip.W83687THF:
   1.458 -              superIOs.Add(new W836XX(chip, revision, address));
   1.459 -              break;
   1.460 -            case Chip.F71858:
   1.461 -            case Chip.F71862:
   1.462 -            case Chip.F71869:
   1.463 -            case Chip.F71882:
   1.464 -            case Chip.F71889ED:
   1.465 -            case Chip.F71889F:
   1.466 -              if (vendorID != FINTEK_VENDOR_ID) {
   1.467 -                report.Append("Chip ID: 0x");
   1.468 -                report.AppendLine(chip.ToString("X"));
   1.469 -                report.Append("Chip revision: 0x");
   1.470 -                report.AppendLine(revision.ToString("X", CultureInfo.InvariantCulture));
   1.471 -                report.Append("Error: Invalid vendor ID 0x");
   1.472 -                report.AppendLine(vendorID.ToString("X", CultureInfo.InvariantCulture));
   1.473 -                report.AppendLine();
   1.474 -                return;
   1.475 -              }
   1.476 -              superIOs.Add(new F718XX(chip, address));
   1.477 -              break;
   1.478 -            default: break;
   1.479 -          }
   1.480 -
   1.481 -          return;
   1.482 -        }
   1.483 -
   1.484 -        IT87Enter();
   1.485 -
   1.486 -        ushort chipID = ReadWord(CHIP_ID_REGISTER);
   1.487 -        switch (chipID) {
   1.488 -          case 0x8712: chip = Chip.IT8712F; break;
   1.489 -          case 0x8716: chip = Chip.IT8716F; break;
   1.490 -          case 0x8718: chip = Chip.IT8718F; break;
   1.491 -          case 0x8720: chip = Chip.IT8720F; break;
   1.492 -          case 0x8726: chip = Chip.IT8726F; break;
   1.493 -          default: chip = Chip.Unknown; break;
   1.494 -        }
   1.495 -        if (chip == Chip.Unknown) {
   1.496 -          if (chipID != 0 && chipID != 0xffff) {
   1.497 -            IT87Exit();
   1.498 -
   1.499 -            report.Append("Chip ID: Unknown ITE with ID 0x");
   1.500 -            report.AppendLine(chipID.ToString("X", CultureInfo.InvariantCulture));
   1.501 -            report.AppendLine();
   1.502 -          }
   1.503 -        } else {
   1.504 -          Select(IT87_ENVIRONMENT_CONTROLLER_LDN);
   1.505 -          ushort address = ReadWord(BASE_ADDRESS_REGISTER);
   1.506 -          Thread.Sleep(1);
   1.507 -          ushort verify = ReadWord(BASE_ADDRESS_REGISTER);
   1.508 -
   1.509 -          byte version = (byte)(ReadByte(IT87_CHIP_VERSION_REGISTER) & 0x0F);
   1.510 -
   1.511 -          IT87Exit();
   1.512 -
   1.513 -          if (address != verify || address < 0x100 || (address & 0xF007) != 0) {
   1.514 -            report.Append("Chip ID: 0x");
   1.515 -            report.AppendLine(chip.ToString("X"));
   1.516 -            report.Append("Error: Invalid address 0x");
   1.517 -            report.AppendLine(address.ToString("X", CultureInfo.InvariantCulture));
   1.518 -            report.AppendLine();
   1.519 -            return;
   1.520 -          }
   1.521 -
   1.522 -          superIOs.Add(new IT87XX(chip, address, version));
   1.523 -
   1.524 -          return;
   1.525 -        }
   1.526 -
   1.527 -        SMSCEnter();
   1.528 -
   1.529 -        chipID = ReadWord(CHIP_ID_REGISTER);
   1.530 -        switch (chipID) {
   1.531 -          default: chip = Chip.Unknown; break;
   1.532 -        }
   1.533 -        if (chip == Chip.Unknown) {
   1.534 -          if (chipID != 0 && chipID != 0xffff) {
   1.535 -            SMSCExit();
   1.536 -
   1.537 -            report.Append("Chip ID: Unknown SMSC with ID 0x");
   1.538 -            report.AppendLine(chipID.ToString("X", CultureInfo.InvariantCulture));
   1.539 -            report.AppendLine();
   1.540 -          }
   1.541 -        } else {
   1.542 -          SMSCExit();
   1.543 -
   1.544 -          return;
   1.545 -        }
   1.546 +        if (DetectSMSC()) continue;
   1.547        }  
   1.548      }
   1.549