slow probe for ata channel with only an atapi master on it

Divacky Roman xdivac02 at stud.fit.vutbr.cz
Mon Jan 5 01:02:32 PST 2004


On Mon, Dec 29, 2003 at 04:36:13PM +1100, Bruce Evans wrote:
> Probing for a nonexistent slave on ata1 now takes 31+epsilon seconds
> in -current.  The master is a cdrom burner (<RICOH CD-RW MP7320A/bp13>)
> jumpered as a master:
> 
> %%%
> ata1: reset tp1 mask=03 ostat0=50 ostat1=01
> ata1-master: stat=0x00 err=0x01 lsb=0x14 msb=0xeb
> ata1-slave:  stat=0x01 err=0x00 lsb=0x00 msb=0x00
> [... 310 - 2 = 308 more of these deleted]
> ata1-slave:  stat=0x01 err=0x00 lsb=0x00 msb=0x00
> ata1: reset tp2 mask=01 stat0=00 stat1=81 devices=0x4<ATAPI_MASTER>
> ata1: at 0x170 irq 15 on atapci0
> ata1: [MPSAFE]
> %%%
> 
> This is because the slave status is always 1 and ata_reset() doesn't
> understand this.
> 
> Another channel with an atapi slave only works a bit better, although
> this setup is outside of the ata spec:
> 
> %%%
> atapci1: <HighPoint HPT366 UDMA66 controller> port 0xbc00-0xbcff,0xb800-0xb803,0xb400-0xb407 irq 11 at device 19.0 on pci0
> atapci1: [MPSAFE]
> ata2: reset tp1 mask=03 ostat0=7f ostat1=50
> ata2-master: stat=0x7f err=0x7f lsb=0x7f msb=0x7f
> ata2-master: stat=0x7f err=0x7f lsb=0x7f msb=0x7f
> ata2-master: stat=0x7f err=0x7f lsb=0x7f msb=0x7f
> ata2-master: stat=0x7f err=0x7f lsb=0x7f msb=0x7f
> ata2-master: stat=0x7f err=0x7f lsb=0x7f msb=0x7f
> ata2-master: stat=0x7f err=0x7f lsb=0x7f msb=0x7f
> ata2-master: stat=0x7f err=0x7f lsb=0x7f msb=0x7f
> ata2-master: stat=0x7f err=0x7f lsb=0x7f msb=0x7f
> ata2-master: stat=0x7f err=0x7f lsb=0x7f msb=0x7f
> ata2-master: stat=0x7f err=0x7f lsb=0x7f msb=0x7f
> ata2-master: stat=0x7f err=0x7f lsb=0x7f msb=0x7f
> ata2-master: stat=0x7f err=0x7f lsb=0x7f msb=0x7f
> ata2-master: stat=0x7f err=0x7f lsb=0x7f msb=0x7f
> ata2-master: stat=0x7f err=0x7f lsb=0x7f msb=0x7f
> ata2-master: stat=0x7f err=0x7f lsb=0x7f msb=0x7f
> ata2-master: stat=0x7f err=0x7f lsb=0x7f msb=0x7f
> ata2-master: stat=0x7f err=0x7f lsb=0x7f msb=0x7f
> ata2-master: stat=0x7f err=0x7f lsb=0x7f msb=0x7f
> ata2-master: stat=0x7f err=0x7f lsb=0x7f msb=0x7f
> ata2-master: stat=0x7f err=0x7f lsb=0x7f msb=0x7f
> ata2-master: stat=0x7f err=0x7f lsb=0x7f msb=0x7f
> ata2-master: stat=0x7f err=0x7f lsb=0x7f msb=0x7f
> ata2-master: stat=0x7f err=0x7f lsb=0x7f msb=0x7f
> ata2-slave:  stat=0x00 err=0x01 lsb=0x14 msb=0xeb
> ata2: reset tp2 mask=02 stat0=ff stat1=00 devices=0x8<ATAPI_SLAVE>
> ata2: at 0xb400 on atapci1
> ata2: [MPSAFE]
> %%%
> 
> Here it takes 23 status reports to time out the master.  I think 23 is
> from the magic 20 in the code (don't know why it is 3 more).
> 
> These problems are missing in my version.  It trusts the busy bits and
> decides that the nonexistent device is not there immediately after both
> the busy bits become clear, which happens after just 1 or 2 iterations
> of the loop (with a delay of 10 msec instead of 100 msec between the
> iterations).
> 
> %%%
> ata1: reset tp1 mask=03 ostat0=50 ostat1=01
> ata1: master @1.038311: d0 00 00 02; slave @1.038334: 01 00 00 00
>              [^^^^^^^^ uptime when we read the registers]
> ata1: master @1.038826: 00 01 14 eb; slave @1.038848: 01 00 00 00
> ata1-master: stat=0x00 err=0x01 lsb=0x14 msb=0xeb
> ata1-slave:  stat=0x01 err=0x00 lsb=0x00 msb=0x00
> ata1: reset tp2 mask=03 stat0=00 stat1=01 devices=0x4<ATAPI_MASTER>
>                      ^^
> 		     not adjusted since it doesn't affect the loop in my version
> ata1: at 0x170 irq 15 on atapci0
> ata1: [MPSAFE]
> ...
> atapci1: <HighPoint HPT366 UDMA66 controller> port 0xbc00-0xbcff,0xb800-0xb803,0xb400-0xb407 irq 11 at device 19.0 on pci0
> atapci1: [MPSAFE]
> ata2: reset tp1 mask=03 ostat0=7f ostat1=50
> ata2: master @1.060667: 7f 7f 7f 7f; slave @1.060696: 00 01 14 eb
> ata2-master: stat=0x7f err=0x7f lsb=0x7f msb=0x7f
> ata2-slave:  stat=0x00 err=0x01 lsb=0x14 msb=0xeb
> ata2: reset tp2 mask=03 stat0=7f stat1=00 devices=0x8<ATAPI_SLAVE>
> ata2: at 0xb400 on atapci1
> ata2: [MPSAFE]
> %%%
> 
> Bruce

I have something similar but with different numbers of stat and error
stat=0x50 err=0x50 lsb=0x50 msb=0x50

something should be added to ata_reset to understand this


More information about the freebsd-current mailing list