From: Adam Belay # -------------------------------------------- # 03/11/15 ambx1@neo.rr.com 1.1450 # [BUG][PATCH] isapnp does not detect some cards # # From: Paul L. Rogers # # Plug and Play Cards (Tested only one at a time. One ISA slot): # NCI1000 NewCom 33.6KifxC ISA PnP Data/Fax Modem # ADP1542 Adaptec AHA-1542CP ISA PnP SCSI Host Adapter # # Problem Description: # The Linux ISA PnP subsystem assumes that the checksum of the # Vendor ID and the Serial Number returned by a PnP card in # the Config state is valid. However, the Plug and Play ISA # Specification (Version 1.0a) found at # http://www.nondot.org/sabre/os/files/PlugNPlay/PNP-ISA-v1.0a.pdf, # states in Section 4.5 that when a card enters the Config state # directly from the Sleep state and the 9-byte serial identifier # is read, the checksum byte is not valid. # # While some cards do return a valid checksum in this case # (ADP1542), others do not (NCI1000) and thus are not detected # since isapnp_build_device_list requires that the computed # checksum match the checksum returned by the card. # # Workaround: # Continue using the isapnp utility instead of the kernel PnP support. # # Proposed solution: # The attached patch removes checksum related tests from # isapnp_build_device_list and instead relies on the behavior # documented in Section 6.1 of the PnP ISA Specification that # specifies that Bit[7] of Vendor ID Byte 0 must be 0 to # determine if the selected CSN is returning valid data. # # A longer term solution would be for isapnp_build_device_list to # only access CSNs that were assigned during the Isolation process. # -------------------------------------------- # drivers/pnp/isapnp/core.c | 8 +++----- 1 files changed, 3 insertions(+), 5 deletions(-) diff -puN drivers/pnp/isapnp/core.c~pnp-fix-3 drivers/pnp/isapnp/core.c --- 25/drivers/pnp/isapnp/core.c~pnp-fix-3 2003-11-15 23:03:07.000000000 -0800 +++ 25-akpm/drivers/pnp/isapnp/core.c 2003-11-15 23:03:07.000000000 -0800 @@ -890,11 +890,9 @@ static int __init isapnp_build_device_li header[4], header[5], header[6], header[7], header[8]); printk(KERN_DEBUG "checksum = 0x%x\n", checksum); #endif - /* Don't be strict on the checksum, here ! - e.g. 'SCM SwapBox Plug and Play' has header[8]==0 (should be: b7)*/ - if (header[8] == 0) - ; - else if (checksum == 0x00 || checksum != header[8]) /* not valid CSN */ + /* Per Section 6.1 of the Plug and Play ISA Specification (Version 1.0a), */ + /* Bit[7] of Vendor ID Byte 0 must be 0 */ + if (header[0] & 0x80) /* not valid CSN */ continue; if ((card = isapnp_alloc(sizeof(struct pnp_card))) == NULL) continue; _