Re: ATA MODE_SENSE_BIG timeout
- Original Message - From: Luoqi Chen [EMAIL PROTECTED] To: David Xu [EMAIL PROTECTED]; [EMAIL PROTECTED] Sent: Wednesday, March 05, 2003 8:44 AM Subject: RE: ATA MODE_SENSE_BIG timeout For those want to fix ATA code, I have another problem with CURRENT. I have a Tyan Tiger 230T which is based on VIA Apollo 133T, south bridge is VIA 686B. On second IDE, I have a Mitsubishi 52X cdrom as master, and a Sony 16X CD R/W as slave, when startup, kernel is always stuck at MODE_SENSE_BIG timeout. I fortunately catched the dmesg text since ATA code past the probing stage. In most case, it will be stuck there forever. BTW, both Linux (2.2.14, Redhat) and MS Windows can probe these devices in few seconds without any problem. I had more than a few machines behaved this way. I believe the problem is with the probe and attach sequence of our ata driver. After an ATA reset, according to spec, an ATAPI device is supposed to present the ATAPI signature and deassert the ready bit, until it receives its first packet command. However when the ata driver issues the first mode sense command, it polls first for the ready bit which never becomes set and the operation times out. The most obviously solution is sending the first command without checking for the ready bit. My solution is a little different, but works equally well, instead I issue an ATAPI reset (what now called a device reset?), because I don't want to write another or alter the current ata_command function and we need an atapi_reset function anyway. According spec, atapi devices SHOULD ONLY be reset via the atapi reset command (our ata driver doesn't follow this rule). The patch is for -stable. I hope it's not too difficult to port to -current. I have applied the patch manually to CURRENT, it helps nothing. :( Then I booted kernel without the patch, waited for a very long time to let ata code retry, finally it found the Sony 16X CD RW, but I can not mount it. It is always timeout. David Xu To Unsubscribe: send mail to [EMAIL PROTECTED] with unsubscribe freebsd-current in the body of the message
Re: ATA MODE_SENSE_BIG timeout
- Original Message - From: Soeren Schmidt [EMAIL PROTECTED] To: David Xu [EMAIL PROTECTED] Cc: [EMAIL PROTECTED] Sent: Tuesday, March 04, 2003 3:56 PM Subject: Re: ATA MODE_SENSE_BIG timeout It seems David Xu wrote: (snip snap) acd1: read data overrun 34/0 acd1: MODE_SENSE_BIG command timeout - resetting ata1: resetting devices .. done acd1: CD-RW SONY CD-RW CRX140E at ata1-slave PIO4 Hmm, can you use the acd1 device normally or does it fail (how) ? -Søren It is very rare that the CD-RW will be found now, kernel is always stuck there, so I must pull the device off or disable Second IDE in BIOS, I can not use it. David Xu To Unsubscribe: send mail to [EMAIL PROTECTED] with unsubscribe freebsd-current in the body of the message
Re: ATA MODE_SENSE_BIG timeout
It seems David Xu wrote: (snip snap) acd1: read data overrun 34/0 acd1: MODE_SENSE_BIG command timeout - resetting ata1: resetting devices .. done acd1: CD-RW SONY CD-RW CRX140E at ata1-slave PIO4 Hmm, can you use the acd1 device normally or does it fail (how) ? -Søren It is very rare that the CD-RW will be found now, kernel is always stuck there, so I must pull the device off or disable Second IDE in BIOS, I can not use it. OK, from the above it looked like it was found after the retries.. I'll try to reproduce the problem here, but so far no luck at that.. -Søren To Unsubscribe: send mail to [EMAIL PROTECTED] with unsubscribe freebsd-current in the body of the message
Re: ATA MODE_SENSE_BIG timeout
On 04-Mar-2003 Soeren Schmidt wrote: It seems David Xu wrote: (snip snap) acd1: read data overrun 34/0 acd1: MODE_SENSE_BIG command timeout - resetting ata1: resetting devices .. done acd1: CD-RW SONY CD-RW CRX140E at ata1-slave PIO4 Hmm, can you use the acd1 device normally or does it fail (how) ? -Søren It is very rare that the CD-RW will be found now, kernel is always stuck there, so I must pull the device off or disable Second IDE in BIOS, I can not use it. OK, from the above it looked like it was found after the retries.. I'll try to reproduce the problem here, but so far no luck at that.. I've seen this same problem trying to install 4.7 on a box with a 52x drive. I don't have that drive around anymore and I'm not sure if it was the same make/model. -- John Baldwin [EMAIL PROTECTED]http://www.FreeBSD.org/~jhb/ Power Users Use the Power to Serve! - http://www.FreeBSD.org/ To Unsubscribe: send mail to [EMAIL PROTECTED] with unsubscribe freebsd-current in the body of the message
RE: ATA MODE_SENSE_BIG timeout
For those want to fix ATA code, I have another problem with CURRENT. I have a Tyan Tiger 230T which is based on VIA Apollo 133T, south bridge is VIA 686B. On second IDE, I have a Mitsubishi 52X cdrom as master, and a Sony 16X CD R/W as slave, when startup, kernel is always stuck at MODE_SENSE_BIG timeout. I fortunately catched the dmesg text since ATA code past the probing stage. In most case, it will be stuck there forever. BTW, both Linux (2.2.14, Redhat) and MS Windows can probe these devices in few seconds without any problem. I had more than a few machines behaved this way. I believe the problem is with the probe and attach sequence of our ata driver. After an ATA reset, according to spec, an ATAPI device is supposed to present the ATAPI signature and deassert the ready bit, until it receives its first packet command. However when the ata driver issues the first mode sense command, it polls first for the ready bit which never becomes set and the operation times out. The most obviously solution is sending the first command without checking for the ready bit. My solution is a little different, but works equally well, instead I issue an ATAPI reset (what now called a device reset?), because I don't want to write another or alter the current ata_command function and we need an atapi_reset function anyway. According spec, atapi devices SHOULD ONLY be reset via the atapi reset command (our ata driver doesn't follow this rule). The patch is for -stable. I hope it's not too difficult to port to -current. -lq Index: atapi-all.c === RCS file: /home/ncvs/src/sys/dev/ata/atapi-all.c,v retrieving revision 1.46.2.18 diff -u -r1.46.2.18 atapi-all.c --- atapi-all.c 31 Oct 2002 23:10:33 - 1.46.2.18 +++ atapi-all.c 19 Dec 2002 19:59:20 - @@ -48,6 +48,7 @@ #include dev/ata/atapi-all.h /* prototypes */ +static void atapi_reset(struct ata_device *); static void atapi_read(struct atapi_request *, int); static void atapi_write(struct atapi_request *, int); static void atapi_finish(struct atapi_request *); @@ -77,6 +78,7 @@ ata_umode(atadev-param), atadev-param-support_dma); ATA_SLEEPLOCK_CH(atadev-channel, ATA_CONTROL); +atapi_reset(atadev); if (atapi_dma !(atadev-param-drq_type == ATAPI_DRQT_INTR)) { ata_dmainit(atadev-channel, atadev-unit, (ata_pmode(atadev-param) 0) ? @@ -483,6 +485,8 @@ void atapi_reinit(struct ata_device *atadev) { +atapi_reset(atadev); + /* reinit device parameters */ if (atadev-mode = ATA_DMA) ata_dmainit(atadev-channel, atadev-unit, @@ -536,6 +540,43 @@ } static void +atapi_reset(struct ata_device *atadev) +{ +struct ata_channel *ch = atadev-channel; +u_int8_t stat, lsb, msb; +int timeout; + +ATA_OUTB(ch-r_io, ATA_DRIVE, ATA_D_IBM | atadev-unit); +DELAY(10); +ATA_OUTB(ch-r_altio, ATA_ALTSTAT, ATA_A_4BIT | ATA_A_IDS); +DELAY(10); +ATA_OUTB(ch-r_io, ATA_DRIVE, ATA_D_IBM | atadev-unit); +DELAY(10); +ATA_OUTB(ch-r_io, ATA_CMD, ATA_C_ATAPI_RESET); + +for (timeout = 1; timeout; timeout--) { + DELAY(100); + ATA_OUTB(ch-r_io, ATA_DRIVE, ATA_D_IBM | atadev-unit); + DELAY(10); + lsb = ATA_INB(ch-r_io, ATA_CYL_LSB); + msb = ATA_INB(ch-r_io, ATA_CYL_MSB); + stat = ATA_INB(ch-r_io, ATA_STATUS); + if ((stat ATA_S_BUSY) == 0) + break; +} + +if (bootverbose) + ata_prtdev(atadev, stat %x, lsb %x, msb %x\n, stat, lsb, msb); + +if (timeout == 0) + ata_prtdev(atadev, soft reset failed\n); + +ATA_OUTB(ch-r_io, ATA_DRIVE, ATA_D_IBM | atadev-unit); +DELAY(10); +ATA_OUTB(ch-r_altio, ATA_ALTSTAT, ATA_A_4BIT); +} + +static void atapi_read(struct atapi_request *request, int length) { int8_t **buffer = (int8_t **)request-data; @@ -617,10 +658,13 @@ { struct ata_device *atadev = request-device; +ATA_FORCELOCK_CH(atadev-channel, ATA_CONTROL); atadev-channel-running = NULL; ata_prtdev(atadev, %s command timeout - resetting\n, atapi_cmd2str(request-ccb[0])); +atapi_reset(atadev); + if (request-flags ATPR_F_DMA_USED) { ata_dmadone(atadev-channel); if (request-retries == ATAPI_MAX_RETRIES) { @@ -631,17 +675,20 @@ request-retries = 0; } } +ATA_UNLOCK_CH(atadev-channel); /* if retries still permit, reinject this request */ if (request-retries++ ATAPI_MAX_RETRIES) { + int s = splbio(); TAILQ_INSERT_HEAD(atadev-channel-atapi_queue, request, chain); + ata_start(atadev-channel); + splx(s); } else { /* retries all used up, return error */ request-error = EIO; wakeup((caddr_t)request); } -ata_reinit(atadev-channel); } static char * To Unsubscribe: send mail to [EMAIL PROTECTED] with unsubscribe freebsd-current in the body
Re: ATA MODE_SENSE_BIG timeout
It seems David Xu wrote: (snip snap) acd1: read data overrun 34/0 acd1: MODE_SENSE_BIG command timeout - resetting ata1: resetting devices .. done acd1: CD-RW SONY CD-RW CRX140E at ata1-slave PIO4 Hmm, can you use the acd1 device normally or does it fail (how) ? -Søren To Unsubscribe: send mail to [EMAIL PROTECTED] with unsubscribe freebsd-current in the body of the message