Skip to content

Commit 4edfd20

Browse files
committed
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: mask off DET when restoring SControl for detach libata: implement ATA_HORKAGE_ATAPI_MOD16_DMA and apply it libata: Fix a potential race condition in ata_scsi_park_show() sata_nv: fix generic, nf2/3 detection regression sata_via: restore vt*_prepare_host error handling sata_promise: add ATA engine reset to reset ops
2 parents 54074d5 + 299246f commit 4edfd20

File tree

6 files changed

+58
-34
lines changed

6 files changed

+58
-34
lines changed

drivers/ata/libata-core.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4024,6 +4024,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
40244024

40254025
/* Weird ATAPI devices */
40264026
{ "TORiSAN DVD-ROM DRD-N216", NULL, ATA_HORKAGE_MAX_SEC_128 },
4027+
{ "QUANTUM DAT DAT72-000", NULL, ATA_HORKAGE_ATAPI_MOD16_DMA },
40274028

40284029
/* Devices we expect to fail diagnostics */
40294030

@@ -4444,7 +4445,8 @@ int atapi_check_dma(struct ata_queued_cmd *qc)
44444445
/* Don't allow DMA if it isn't multiple of 16 bytes. Quite a
44454446
* few ATAPI devices choke on such DMA requests.
44464447
*/
4447-
if (unlikely(qc->nbytes & 15))
4448+
if (!(qc->dev->horkage & ATA_HORKAGE_ATAPI_MOD16_DMA) &&
4449+
unlikely(qc->nbytes & 15))
44484450
return 1;
44494451

44504452
if (ap->ops->check_atapi_dma)
@@ -5934,7 +5936,7 @@ static void ata_port_detach(struct ata_port *ap)
59345936
* to us. Restore SControl and disable all existing devices.
59355937
*/
59365938
__ata_port_for_each_link(link, ap) {
5937-
sata_scr_write(link, SCR_CONTROL, link->saved_scontrol);
5939+
sata_scr_write(link, SCR_CONTROL, link->saved_scontrol & 0xff0);
59385940
ata_link_for_each_dev(dev, link)
59395941
ata_dev_disable(dev);
59405942
}

drivers/ata/libata-scsi.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ static ssize_t ata_scsi_park_show(struct device *device,
190190
struct ata_port *ap;
191191
struct ata_link *link;
192192
struct ata_device *dev;
193-
unsigned long flags;
193+
unsigned long flags, now;
194194
unsigned int uninitialized_var(msecs);
195195
int rc = 0;
196196

@@ -208,10 +208,11 @@ static ssize_t ata_scsi_park_show(struct device *device,
208208
}
209209

210210
link = dev->link;
211+
now = jiffies;
211212
if (ap->pflags & ATA_PFLAG_EH_IN_PROGRESS &&
212213
link->eh_context.unloaded_mask & (1 << dev->devno) &&
213-
time_after(dev->unpark_deadline, jiffies))
214-
msecs = jiffies_to_msecs(dev->unpark_deadline - jiffies);
214+
time_after(dev->unpark_deadline, now))
215+
msecs = jiffies_to_msecs(dev->unpark_deadline - now);
215216
else
216217
msecs = 0;
217218

drivers/ata/sata_nv.c

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -307,10 +307,10 @@ static int nv_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val);
307307

308308
static void nv_nf2_freeze(struct ata_port *ap);
309309
static void nv_nf2_thaw(struct ata_port *ap);
310+
static int nv_nf2_hardreset(struct ata_link *link, unsigned int *class,
311+
unsigned long deadline);
310312
static void nv_ck804_freeze(struct ata_port *ap);
311313
static void nv_ck804_thaw(struct ata_port *ap);
312-
static int nv_hardreset(struct ata_link *link, unsigned int *class,
313-
unsigned long deadline);
314314
static int nv_adma_slave_config(struct scsi_device *sdev);
315315
static int nv_adma_check_atapi_dma(struct ata_queued_cmd *qc);
316316
static void nv_adma_qc_prep(struct ata_queued_cmd *qc);
@@ -405,17 +405,8 @@ static struct scsi_host_template nv_swncq_sht = {
405405
.slave_configure = nv_swncq_slave_config,
406406
};
407407

408-
/* OSDL bz3352 reports that some nv controllers can't determine device
409-
* signature reliably and nv_hardreset is implemented to work around
410-
* the problem. This was reported on nf3 and it's unclear whether any
411-
* other controllers are affected. However, the workaround has been
412-
* applied to all variants and there isn't much to gain by trying to
413-
* find out exactly which ones are affected at this point especially
414-
* because NV has moved over to ahci for newer controllers.
415-
*/
416408
static struct ata_port_operations nv_common_ops = {
417409
.inherits = &ata_bmdma_port_ops,
418-
.hardreset = nv_hardreset,
419410
.scr_read = nv_scr_read,
420411
.scr_write = nv_scr_write,
421412
};
@@ -429,12 +420,22 @@ static struct ata_port_operations nv_generic_ops = {
429420
.hardreset = ATA_OP_NULL,
430421
};
431422

423+
/* OSDL bz3352 reports that nf2/3 controllers can't determine device
424+
* signature reliably. Also, the following thread reports detection
425+
* failure on cold boot with the standard debouncing timing.
426+
*
427+
* http://thread.gmane.org/gmane.linux.ide/34098
428+
*
429+
* Debounce with hotplug timing and request follow-up SRST.
430+
*/
432431
static struct ata_port_operations nv_nf2_ops = {
433432
.inherits = &nv_common_ops,
434433
.freeze = nv_nf2_freeze,
435434
.thaw = nv_nf2_thaw,
435+
.hardreset = nv_nf2_hardreset,
436436
};
437437

438+
/* CK804 finally gets hardreset right */
438439
static struct ata_port_operations nv_ck804_ops = {
439440
.inherits = &nv_common_ops,
440441
.freeze = nv_ck804_freeze,
@@ -443,7 +444,7 @@ static struct ata_port_operations nv_ck804_ops = {
443444
};
444445

445446
static struct ata_port_operations nv_adma_ops = {
446-
.inherits = &nv_common_ops,
447+
.inherits = &nv_ck804_ops,
447448

448449
.check_atapi_dma = nv_adma_check_atapi_dma,
449450
.sff_tf_read = nv_adma_tf_read,
@@ -467,7 +468,7 @@ static struct ata_port_operations nv_adma_ops = {
467468
};
468469

469470
static struct ata_port_operations nv_swncq_ops = {
470-
.inherits = &nv_common_ops,
471+
.inherits = &nv_generic_ops,
471472

472473
.qc_defer = ata_std_qc_defer,
473474
.qc_prep = nv_swncq_qc_prep,
@@ -1553,6 +1554,17 @@ static void nv_nf2_thaw(struct ata_port *ap)
15531554
iowrite8(mask, scr_addr + NV_INT_ENABLE);
15541555
}
15551556

1557+
static int nv_nf2_hardreset(struct ata_link *link, unsigned int *class,
1558+
unsigned long deadline)
1559+
{
1560+
bool online;
1561+
int rc;
1562+
1563+
rc = sata_link_hardreset(link, sata_deb_timing_hotplug, deadline,
1564+
&online, NULL);
1565+
return online ? -EAGAIN : rc;
1566+
}
1567+
15561568
static void nv_ck804_freeze(struct ata_port *ap)
15571569
{
15581570
void __iomem *mmio_base = ap->host->iomap[NV_MMIO_BAR];
@@ -1605,21 +1617,6 @@ static void nv_mcp55_thaw(struct ata_port *ap)
16051617
ata_sff_thaw(ap);
16061618
}
16071619

1608-
static int nv_hardreset(struct ata_link *link, unsigned int *class,
1609-
unsigned long deadline)
1610-
{
1611-
int rc;
1612-
1613-
/* SATA hardreset fails to retrieve proper device signature on
1614-
* some controllers. Request follow up SRST. For more info,
1615-
* see http://bugzilla.kernel.org/show_bug.cgi?id=3352
1616-
*/
1617-
rc = sata_sff_hardreset(link, class, deadline);
1618-
if (rc)
1619-
return rc;
1620-
return -EAGAIN;
1621-
}
1622-
16231620
static void nv_adma_error_handler(struct ata_port *ap)
16241621
{
16251622
struct nv_adma_port_priv *pp = ap->private_data;

drivers/ata/sata_promise.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,10 @@ static void pdc_freeze(struct ata_port *ap);
153153
static void pdc_sata_freeze(struct ata_port *ap);
154154
static void pdc_thaw(struct ata_port *ap);
155155
static void pdc_sata_thaw(struct ata_port *ap);
156+
static int pdc_pata_softreset(struct ata_link *link, unsigned int *class,
157+
unsigned long deadline);
158+
static int pdc_sata_hardreset(struct ata_link *link, unsigned int *class,
159+
unsigned long deadline);
156160
static void pdc_error_handler(struct ata_port *ap);
157161
static void pdc_post_internal_cmd(struct ata_queued_cmd *qc);
158162
static int pdc_pata_cable_detect(struct ata_port *ap);
@@ -186,6 +190,7 @@ static struct ata_port_operations pdc_sata_ops = {
186190
.scr_read = pdc_sata_scr_read,
187191
.scr_write = pdc_sata_scr_write,
188192
.port_start = pdc_sata_port_start,
193+
.hardreset = pdc_sata_hardreset,
189194
};
190195

191196
/* First-generation chips need a more restrictive ->check_atapi_dma op */
@@ -200,6 +205,7 @@ static struct ata_port_operations pdc_pata_ops = {
200205
.freeze = pdc_freeze,
201206
.thaw = pdc_thaw,
202207
.port_start = pdc_common_port_start,
208+
.softreset = pdc_pata_softreset,
203209
};
204210

205211
static const struct ata_port_info pdc_port_info[] = {
@@ -693,6 +699,20 @@ static void pdc_sata_thaw(struct ata_port *ap)
693699
readl(host_mmio + hotplug_offset); /* flush */
694700
}
695701

702+
static int pdc_pata_softreset(struct ata_link *link, unsigned int *class,
703+
unsigned long deadline)
704+
{
705+
pdc_reset_port(link->ap);
706+
return ata_sff_softreset(link, class, deadline);
707+
}
708+
709+
static int pdc_sata_hardreset(struct ata_link *link, unsigned int *class,
710+
unsigned long deadline)
711+
{
712+
pdc_reset_port(link->ap);
713+
return sata_sff_hardreset(link, class, deadline);
714+
}
715+
696716
static void pdc_error_handler(struct ata_port *ap)
697717
{
698718
if (!(ap->pflags & ATA_PFLAG_FROZEN))

drivers/ata/sata_via.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -602,8 +602,10 @@ static int svia_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
602602
rc = vt8251_prepare_host(pdev, &host);
603603
break;
604604
default:
605-
return -EINVAL;
605+
rc = -EINVAL;
606606
}
607+
if (rc)
608+
return rc;
607609

608610
svia_configure(pdev);
609611

include/linux/libata.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,8 @@ enum {
373373
ATA_HORKAGE_IVB = (1 << 8), /* cbl det validity bit bugs */
374374
ATA_HORKAGE_STUCK_ERR = (1 << 9), /* stuck ERR on next PACKET */
375375
ATA_HORKAGE_BRIDGE_OK = (1 << 10), /* no bridge limits */
376+
ATA_HORKAGE_ATAPI_MOD16_DMA = (1 << 11), /* use ATAPI DMA for commands
377+
not multiple of 16 bytes */
376378

377379
/* DMA mask for user DMA control: User visible values; DO NOT
378380
renumber */

0 commit comments

Comments
 (0)