Go to:
Gentoo Home
Documentation
Forums
Lists
Bugs
Planet
Store
Wiki
Get Gentoo!
Gentoo's Bugzilla – Attachment 103499 Details for
Bug 157326
gentoo-sources: patch for failing ata_piix / libata on ICH7/ICH8
Home
|
New
–
[Ex]
|
Browse
|
Search
|
Privacy Policy
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
2.6.19 patch
2619.patch (text/plain), 4.32 KB, created by
Daniel Drake (RETIRED)
on 2006-12-06 16:42:10 UTC
(
hide
)
Description:
2.6.19 patch
Filename:
MIME Type:
Creator:
Daniel Drake (RETIRED)
Created:
2006-12-06 16:42:10 UTC
Size:
4.32 KB
patch
obsolete
>From: Tejun Heo <htejun@gmail.com> >Date: Mon, 9 Oct 2006 09:32:15 +0000 (+0900) >Subject: [PATCH] libata: handle 0xff status properly >X-Git-Url: http://www2.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=d1adc1bbd6dde3e05a91e2d3e6ab42d202ea61d5 > >[PATCH] libata: handle 0xff status properly > >libata waits for !BSY even when the status register reports 0xff. >This causes long boot delays when D8 isn't pulled down properly. This >patch does the followings. > >* don't wait if status register is 0xff in all wait functions > >* make ata_busy_sleep() return 0 on success and -errno on failure. > -ENODEV is returned on 0xff status and -EBUSY on other failures. > >* make ata_bus_softreset() succeed on 0xff status. 0xff status is not > reset failure. It indicates no device. This removes unnecessary > retries on such ports. Note that the code change assumes unoccupied > port reporting 0xff status does not produce valid device signature. > >Signed-off-by: Tejun Heo <htejun@gmail.com> >Cc: Joe Jin <lkmaillist@gmail.com> >Signed-off-by: Jeff Garzik <jeff@garzik.org> >--- > >--- a/drivers/ata/libata-core.c >+++ b/drivers/ata/libata-core.c >@@ -2328,11 +2328,14 @@ static inline void ata_tf_to_host(struct > * Sleep until ATA Status register bit BSY clears, > * or a timeout occurs. > * >- * LOCKING: None. >+ * LOCKING: >+ * Kernel thread context (may sleep). >+ * >+ * RETURNS: >+ * 0 on success, -errno otherwise. > */ >- >-unsigned int ata_busy_sleep (struct ata_port *ap, >- unsigned long tmout_pat, unsigned long tmout) >+int ata_busy_sleep(struct ata_port *ap, >+ unsigned long tmout_pat, unsigned long tmout) > { > unsigned long timer_start, timeout; > u8 status; >@@ -2340,27 +2343,32 @@ unsigned int ata_busy_sleep (struct ata_ > status = ata_busy_wait(ap, ATA_BUSY, 300); > timer_start = jiffies; > timeout = timer_start + tmout_pat; >- while ((status & ATA_BUSY) && (time_before(jiffies, timeout))) { >+ while (status != 0xff && (status & ATA_BUSY) && >+ time_before(jiffies, timeout)) { > msleep(50); > status = ata_busy_wait(ap, ATA_BUSY, 3); > } > >- if (status & ATA_BUSY) >+ if (status != 0xff && (status & ATA_BUSY)) > ata_port_printk(ap, KERN_WARNING, > "port is slow to respond, please be patient " > "(Status 0x%x)\n", status); > > timeout = timer_start + tmout; >- while ((status & ATA_BUSY) && (time_before(jiffies, timeout))) { >+ while (status != 0xff && (status & ATA_BUSY) && >+ time_before(jiffies, timeout)) { > msleep(50); > status = ata_chk_status(ap); > } > >+ if (status == 0xff) >+ return -ENODEV; >+ > if (status & ATA_BUSY) { > ata_port_printk(ap, KERN_ERR, "port failed to respond " > "(%lu secs, Status 0x%x)\n", > tmout / HZ, status); >- return 1; >+ return -EBUSY; > } > > return 0; >@@ -2451,10 +2459,8 @@ static unsigned int ata_bus_softreset(st > * the bus shows 0xFF because the odd clown forgets the D7 > * pulldown resistor. > */ >- if (ata_check_status(ap) == 0xFF) { >- ata_port_printk(ap, KERN_ERR, "SRST failed (status 0xFF)\n"); >- return AC_ERR_OTHER; >- } >+ if (ata_check_status(ap) == 0xFF) >+ return 0; > > ata_bus_post_reset(ap, devmask); > >--- a/include/linux/libata.h >+++ b/include/linux/libata.h >@@ -746,9 +746,8 @@ extern int ata_scsi_device_suspend(struc > extern int ata_host_suspend(struct ata_host *host, pm_message_t mesg); > extern void ata_host_resume(struct ata_host *host); > extern int ata_ratelimit(void); >-extern unsigned int ata_busy_sleep(struct ata_port *ap, >- unsigned long timeout_pat, >- unsigned long timeout); >+extern int ata_busy_sleep(struct ata_port *ap, >+ unsigned long timeout_pat, unsigned long timeout); > extern void ata_port_queue_task(struct ata_port *ap, void (*fn)(void *), > void *data, unsigned long delay); > extern u32 ata_wait_register(void __iomem *reg, u32 mask, u32 val, >@@ -1064,7 +1063,7 @@ static inline u8 ata_busy_wait(struct at > udelay(10); > status = ata_chk_status(ap); > max--; >- } while ((status & bits) && (max > 0)); >+ } while (status != 0xff && (status & bits) && (max > 0)); > > return status; > } >@@ -1085,7 +1084,7 @@ static inline u8 ata_wait_idle(struct at > { > u8 status = ata_busy_wait(ap, ATA_BUSY | ATA_DRQ, 1000); > >- if (status & (ATA_BUSY | ATA_DRQ)) { >+ if (status != 0xff && (status & (ATA_BUSY | ATA_DRQ))) { > unsigned long l = ap->ioaddr.status_addr; > if (ata_msg_warn(ap)) > printk(KERN_WARNING "ATA: abnormal status 0x%X on port 0x%lX\n",
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 157326
:
103451
| 103499