Commit 5da38d32824eb27c325d296bf3a39b5946578789
Exists in
master
and in
39 other branches
Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev
* 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev: libata: fix last_reset timestamp handling libata: Avoid overflow in ata_tf_read_block() when tf->hba_lbal > 127 [libata] pata_pcmcia: another memory card support [libata] pata_sch: notice attached slave devices [libata] pata_cs553*.c: cleanup kernel-doc
Showing 6 changed files Side-by-side Diff
drivers/ata/libata-core.c
drivers/ata/libata-eh.c
... | ... | @@ -610,9 +610,6 @@ |
610 | 610 | if (ata_ncq_enabled(dev)) |
611 | 611 | ehc->saved_ncq_enabled |= 1 << devno; |
612 | 612 | } |
613 | - | |
614 | - /* set last reset timestamp to some time in the past */ | |
615 | - ehc->last_reset = jiffies - 60 * HZ; | |
616 | 613 | } |
617 | 614 | |
618 | 615 | ap->pflags |= ATA_PFLAG_EH_IN_PROGRESS; |
619 | 616 | |
... | ... | @@ -2281,17 +2278,21 @@ |
2281 | 2278 | if (link->flags & ATA_LFLAG_NO_SRST) |
2282 | 2279 | softreset = NULL; |
2283 | 2280 | |
2284 | - now = jiffies; | |
2285 | - deadline = ata_deadline(ehc->last_reset, ATA_EH_RESET_COOL_DOWN); | |
2286 | - if (time_before(now, deadline)) | |
2287 | - schedule_timeout_uninterruptible(deadline - now); | |
2281 | + /* make sure each reset attemp is at least COOL_DOWN apart */ | |
2282 | + if (ehc->i.flags & ATA_EHI_DID_RESET) { | |
2283 | + now = jiffies; | |
2284 | + WARN_ON(time_after(ehc->last_reset, now)); | |
2285 | + deadline = ata_deadline(ehc->last_reset, | |
2286 | + ATA_EH_RESET_COOL_DOWN); | |
2287 | + if (time_before(now, deadline)) | |
2288 | + schedule_timeout_uninterruptible(deadline - now); | |
2289 | + } | |
2288 | 2290 | |
2289 | 2291 | spin_lock_irqsave(ap->lock, flags); |
2290 | 2292 | ap->pflags |= ATA_PFLAG_RESETTING; |
2291 | 2293 | spin_unlock_irqrestore(ap->lock, flags); |
2292 | 2294 | |
2293 | 2295 | ata_eh_about_to_do(link, NULL, ATA_EH_RESET); |
2294 | - ehc->last_reset = jiffies; | |
2295 | 2296 | |
2296 | 2297 | ata_link_for_each_dev(dev, link) { |
2297 | 2298 | /* If we issue an SRST then an ATA drive (not ATAPI) |
... | ... | @@ -2379,7 +2380,6 @@ |
2379 | 2380 | /* |
2380 | 2381 | * Perform reset |
2381 | 2382 | */ |
2382 | - ehc->last_reset = jiffies; | |
2383 | 2383 | if (ata_is_host_link(link)) |
2384 | 2384 | ata_eh_freeze_port(ap); |
2385 | 2385 | |
... | ... | @@ -2391,6 +2391,7 @@ |
2391 | 2391 | reset == softreset ? "soft" : "hard"); |
2392 | 2392 | |
2393 | 2393 | /* mark that this EH session started with reset */ |
2394 | + ehc->last_reset = jiffies; | |
2394 | 2395 | if (reset == hardreset) |
2395 | 2396 | ehc->i.flags |= ATA_EHI_DID_HARDRESET; |
2396 | 2397 | else |
... | ... | @@ -2535,7 +2536,7 @@ |
2535 | 2536 | ata_eh_done(link, NULL, ATA_EH_RESET); |
2536 | 2537 | if (slave) |
2537 | 2538 | ata_eh_done(slave, NULL, ATA_EH_RESET); |
2538 | - ehc->last_reset = jiffies; | |
2539 | + ehc->last_reset = jiffies; /* update to completion time */ | |
2539 | 2540 | ehc->i.action |= ATA_EH_REVALIDATE; |
2540 | 2541 | |
2541 | 2542 | rc = 0; |
drivers/ata/pata_cs5535.c
drivers/ata/pata_cs5536.c
drivers/ata/pata_pcmcia.c
... | ... | @@ -416,6 +416,7 @@ |
416 | 416 | PCMCIA_DEVICE_PROD_ID1("STI Flash", 0xe4a13209), |
417 | 417 | PCMCIA_DEVICE_PROD_ID12("STI", "Flash 5.0", 0xbf2df18d, 0x8cb57a0e), |
418 | 418 | PCMCIA_MFC_DEVICE_PROD_ID12(1, "SanDisk", "ConnectPlus", 0x7a954bd9, 0x74be00c6), |
419 | + PCMCIA_DEVICE_PROD_ID2("Flash Card", 0x5a362506), | |
419 | 420 | PCMCIA_DEVICE_NULL, |
420 | 421 | }; |
421 | 422 |
drivers/ata/pata_sch.c