To apply: cd /usr/src/sys/dev/atapi patch -p0 < atapi.patch Index: acd.c =================================================================== RCS file: /cvs/src/sys/dev/atapi/acd.c,v retrieving revision 1.29 retrieving revision 1.32 diff -u -r1.29 -r1.32 --- acd.c 1997/10/18 10:37:06 1.29 +++ acd.c 1998/07/12 01:20:20 1.32 @@ -1101,6 +1093,7 @@ { struct atapi_read_cd_capacity_data rdcap; struct atapi_read_cd_capacity cmd; + int result; if (acd->ad_link->quirks & AQUIRK_NOCAPACITY) { /* @@ -1125,8 +1118,15 @@ * If the command works, interpret the result as a 4 byte * number of blocks and a blocksize */ - if (atapi_exec_cmd(acd->ad_link, &cmd, sizeof(cmd), - &rdcap, sizeof(rdcap), B_READ, 0) != 0) { + result = atapi_exec_cmd(acd->ad_link, &cmd, sizeof(cmd), + &rdcap, sizeof(rdcap), B_READ, 0); + if (result != 0) { + u_int8_t error = result >> 8; + /* Get the sense key and check for an illegal request */ + if ((error >> 4) == ATAPI_SK_ILLEGAL_REQUEST) { + acd->ad_link->quirks |= AQUIRK_NOCAPACITY; + return acd_size(acd, flags); + } ATAPI_DEBUG_PRINT(("ATAPI_READ_CD_CAPACITY failed\n")); return 0; } Index: atapiconf.c =================================================================== RCS file: /cvs/src/sys/dev/atapi/atapiconf.c,v retrieving revision 1.21 diff -u -r1.21 atapiconf.c --- atapiconf.c 1998/01/02 18:22:07 1.21 +++ atapiconf.c 1998/08/04 21:42:18 @@ -354,6 +357,9 @@ if ((flags & A_POLLED) != 0) atapi_free_pkt(pkt); } + + if ((pkt->status & ERROR) && (pkt->error)) + status |= pkt->error << 8; return status; }