Re: dvd-r detection problem with port multiplier

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



sorry to be a pest with this.
Hopefully this helps though..

> Can you please test the following patch?  The spec says that clearing
> PMP status should be followed by port initialization and I missed that
> before.
> 
> Index: work1/drivers/scsi/sata_sil24.c
> ===================================================================
> --- work1.orig/drivers/scsi/sata_sil24.c	2006-09-27 11:35:00.000000000 +0900
> +++ work1/drivers/scsi/sata_sil24.c	2006-09-27 11:35:04.000000000 +0900
> @@ -594,15 +594,17 @@ static int sil24_init_port(struct ata_po
>  	struct sil24_port_priv *pp = ap->private_data;
>  	u32 tmp;
>  
> +	if (ap->nr_pmp_links) {
> +		/* clear PMP error status */
> +		sil24_clear_pmp(ap);
> +	}
> +
>  	writel(PORT_CS_INIT, port + PORT_CTRL_STAT);
>  	ata_wait_register(port + PORT_CTRL_STAT,
>  			  PORT_CS_INIT, PORT_CS_INIT, 10, 100);
>  	tmp = ata_wait_register(port + PORT_CTRL_STAT,
>  				PORT_CS_RDY, 0, 10, 100);
>  
> -	/* clear PMP error status */
> -	sil24_clear_pmp(ap);
> -
>  	if ((tmp & (PORT_CS_INIT | PORT_CS_RDY)) != PORT_CS_RDY) {
>  		pp->do_port_rst = 1;
>  		ap->link.eh_context.i.action |= ATA_EH_HARDRESET;
> @@ -916,12 +918,12 @@ static void sil24_irq_clear(struct ata_p
>  static void sil24_pmp_attach(struct ata_port *ap)
>  {
>  	sil24_config_pmp(ap, 1);
> -	sil24_clear_pmp(ap);
> +	sil24_init_port(ap);
>  }
>  
>  static void sil24_pmp_detach(struct ata_port *ap)
>  {
> -	sil24_clear_pmp(ap);
> +	sil24_init_port(ap);
>  	sil24_config_pmp(ap, 0);
>  }
>  
> 

that patch did not work for me.

this folling patch did work for me. (I moved the one line fix
into the sil24_init_port function, compared to before)

I wonder if the processer speed makes a difference ?
I'am on a intel 820 D dual core 2.8ghz

I believe the problem is based on a failing PRB_CTRL_SRST, 
while the PORT_CS_INIT is still in progress.
Even though the PORT_CS_RDY comes ready quickly.
I think you can not send another pmp command until the last 
one completes (seems the init is slow on some bridgeboards)
the plextor finsihed in 12/250 seconds, the pioneer in 84/250 sec
The other option is a msleep(1000); in the do_softrest after
the init_port.

It seems you can also monitor the PORT_SACTIVE register with a 
ata_wait_register(port + PORT_SACTIVE, 1, 1, 10, 1000);
to do the same thing.

all in all, it is VERY hard to fix without the same revision
hardware, as if you can't duplicate it, you cant fix it.
The spec does not really tell you what will happen on a init
while in pmp mode. it shows a different enumeration method
than the driver uses for pmp ...

Plus the plextor is very fast, and one slow device, messes it
up for all the other devices.

it seems this may not be optimum on non-pmp hardware though.
my vote would be for the msleep for compatability

Index: drivers/scsi/sata_sil24.c
===================================================================
--- drivers/scsi/sata_sil24.c.orig   2006-09-26 20:34:03.000000000 -0700
+++ drivers/scsi/sata_sil24.c        2006-09-26 21:46:39.000000000 -0700
@@ -595,15 +595,20 @@
        struct sil24_port_priv *pp = ap->private_data;
        u32 tmp;

+       if (ap->nr_pmp_links) {
+               /* clear PMP error status */
+               sil24_clear_pmp(ap);
+       }
+
        writel(PORT_CS_INIT, port + PORT_CTRL_STAT);
        ata_wait_register(port + PORT_CTRL_STAT,
                          PORT_CS_INIT, PORT_CS_INIT, 10, 100);
        tmp = ata_wait_register(port + PORT_CTRL_STAT,
                                PORT_CS_RDY, 0, 10, 100);

-       /* clear PMP error status */
-       sil24_clear_pmp(ap);
-
+       ata_wait_register(port + PORT_CTRL_STAT,
+                               0x1f0000, 0x1f0000, 10, 1000);
+
        if ((tmp & (PORT_CS_INIT | PORT_CS_RDY)) != PORT_CS_RDY) {
                pp->do_port_rst = 1;
                ap->link.eh_context.i.action |= ATA_EH_HARDRESET;
@@ -917,12 +922,12 @@
 static void sil24_pmp_attach(struct ata_port *ap)
 {
        sil24_config_pmp(ap, 1);
-       sil24_clear_pmp(ap);
+       sil24_init_port(ap);
 }

 static void sil24_pmp_detach(struct ata_port *ap)
 {
-       sil24_clear_pmp(ap);
+       sil24_init_port(ap);
        sil24_config_pmp(ap, 0);
 }


here is a dmesg output of the bad and good version
the bad version, just cycles through reseting seamingly "forever"

bad:
------------
sata_sil24 0000:01:00.0: version 0.3
ACPI: PCI Interrupt 0000:01:00.0[A] -> GSI 16 (level, low) -> IRQ 169
PCI: Setting latency timer of device 0000:01:00.0 to 64
ata5: SATA max UDMA/100 cmd 0xFFFFC20000020000 ctl 0x0 bmdma 0x0 irq 169
ata6: SATA max UDMA/100 cmd 0xFFFFC20000022000 ctl 0x0 bmdma 0x0 irq 169
scsi4 : sata_sil24
ata5: SATA link down (SStatus 0 SControl 300)
scsi5 : sata_sil24
ata6: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
ata6.15: Port Multiplier 1.1, 0x1095:0x3726 r23, 5 ports, feat 0x9/0x9
ata6.00: hard resetting port
ata6.00: SATA link down (SStatus 0 SControl 310)
ata6.01: hard resetting port
ata6.01: SATA link down (SStatus 0 SControl 300)
ata6.02: hard resetting port
ata6.02: softreset failed (SRST command error)
ata6.02: follow-up softreset failed, retrying in 5 secs
ata6.02: hard resetting port
ata6.03: hard resetting port
ata6.03: COMRESET failed (errno=-16)
ata6.03: hardreset failed, retrying in 5 secs
ata6.03: hard resetting port
ata6.03: COMRESET failed (errno=-16)
ata6.03: reset failed, giving up
ata6.15: hard resetting port
ata6.15: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
ata6.00: hard resetting port
ata6.00: SATA link down (SStatus 0 SControl 310)
ata6.01: hard resetting port
ata6.01: SATA link down (SStatus 0 SControl 300)
ata6.02: hard resetting port
ata6.02: softreset failed (SRST command error)
ata6.02: follow-up softreset failed, retrying in 5 secs
ata6.02: hard resetting port
ata6.03: hard resetting port
ata6.03: COMRESET failed (errno=-16)
ata6.03: hardreset failed, retrying in 5 secs
ata6.03: hard resetting port
ata6.03: COMRESET failed (errno=-16)
ata6.03: reset failed, giving up
ata6.03: failed to recover link after 2 tries, disabling
ata6: failed to recover PMP, retrying in 5 secs
ata6.15: hard resetting port
ata6: controller in dubious state, performing PORT_RST
ata6.15: SATA link up 3.0 Gbps (SStatus 123 SControl 0)
ata6.00: hard resetting port
ata6.00: SATA link down (SStatus 0 SControl 310)
ata6.01: hard resetting port
ata6.01: SATA link down (SStatus 0 SControl 300)
ata6.02: hard resetting port
ata6.02: softreset failed (SRST command error)
ata6.02: follow-up softreset failed, retrying in 5 secs
ata6.02: hard resetting port
ata6.04: hard resetting port
ata6.04: COMRESET failed (errno=-16)
ata6.04: hardreset failed, retrying in 5 secs
ata6.04: hard resetting port
ata6.04: COMRESET failed (errno=-16)
ata6.04: reset failed, giving up
ata6.15: hard resetting port
ata6: controller in dubious state, performing PORT_RST
ata6.15: SATA link up 3.0 Gbps (SStatus 123 SControl 0)
ata6.00: hard resetting port
ata6.00: SATA link down (SStatus 0 SControl 310)
ata6.01: hard resetting port
ata6.01: SATA link down (SStatus 0 SControl 300)
ata6.02: hard resetting port
ata6.02: softreset failed (SRST command error)
ata6.02: follow-up softreset failed, retrying in 5 secs
ata6.02: hard resetting port
ata6.04: hard resetting port
ata6.04: COMRESET failed (errno=-16)
ata6.04: hardreset failed, retrying in 5 secs
ata6.04: hard resetting port
ata6.04: COMRESET failed (errno=-16)
ata6.04: reset failed, giving up
ata6.04: failed to recover link after 2 tries, disabling
ata6: failed to recover PMP, retrying in 5 secs
ata6.15: hard resetting port
ata6: controller in dubious state, performing PORT_RST
ata6.15: SATA link up 3.0 Gbps (SStatus 123 SControl 0)
ata6.00: hard resetting port
ata6.00: SATA link down (SStatus 0 SControl 310)
ata6.01: hard resetting port
ata6.01: SATA link down (SStatus 0 SControl 300)
ata6.02: hard resetting port
ata6.02: softreset failed (SRST command error)
ata6.02: follow-up softreset failed, retrying in 5 secs
ata6.02: hard resetting port
ata6.15: failed to read PMP_GSCR_ERROR
ata6: failed to recover PMP, retrying in 5 secs
ata6.15: hard resetting port
ata6: controller in dubious state, performing PORT_RST
ata6.15: SATA link up 3.0 Gbps (SStatus 123 SControl 0)
ata6.00: hard resetting port
ata6.00: SATA link down (SStatus 0 SControl 310)
ata6.01: hard resetting port
ata6.01: SATA link down (SStatus 0 SControl 300)
ata6.02: hard resetting port
ata6.02: softreset failed (SRST command error)
ata6.02: follow-up softreset failed, retrying in 5 secs
ata6.02: hard resetting port
ata6.15: failed to read PMP_GSCR_ERROR
ata6: failed to recover PMP, retrying in 5 secs
ata6.15: hard resetting port
ata6: controller in dubious state, performing PORT_RST
ata6.15: SATA link up 3.0 Gbps (SStatus 123 SControl 0)
ata6.00: hard resetting port
ata6.00: SATA link down (SStatus 0 SControl 310)
ata6.01: hard resetting port
ata6.01: SATA link down (SStatus 0 SControl 300)
ata6.02: hard resetting port
ata6.02: softreset failed (SRST command error)
ata6.02: follow-up softreset failed, retrying in 5 secs
ata6.02: hard resetting port
ata6.15: failed to read PMP_GSCR_ERROR
ata6: failed to recover PMP after 5 tries, giving up
ata6.15: Port Multiplier detaching
ata6.00: disabled
ata6: EH pending after completion, repeating EH (cnt=4)
ata6: exception Emask 0x100 SAct 0x0 SErr 0x0 action 0x1
ata6: (irq_stat 0x08040800, SDB notify)
ata6: EH complete

good:
------------
sata_sil24 0000:01:00.0: version 0.3
ACPI: PCI Interrupt 0000:01:00.0[A] -> GSI 16 (level, low) -> IRQ 169
PCI: Setting latency timer of device 0000:01:00.0 to 64
ata7: SATA max UDMA/100 cmd 0xFFFFC20000020000 ctl 0x0 bmdma 0x0 irq 169
ata8: SATA max UDMA/100 cmd 0xFFFFC20000022000 ctl 0x0 bmdma 0x0 irq 169
scsi6 : sata_sil24
ata7: SATA link down (SStatus 0 SControl 300)
scsi7 : sata_sil24
ata8: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
ata8.15: Port Multiplier 1.1, 0x1095:0x3726 r23, 5 ports, feat 0x9/0x9
ata8.00: hard resetting port
ata8.00: SATA link down (SStatus 0 SControl 310)
ata8.01: hard resetting port
ata8.01: SATA link down (SStatus 0 SControl 300)
ata8.02: hard resetting port
ata8.02: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
ata8.03: hard resetting port
ata8.03: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
ata8.04: hard resetting port
ata8.04: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
ata8.02: ATAPI, max UDMA/66
ata8.02: configured for UDMA/66
ata8.03: ATAPI, max UDMA/66
ata8.03: configured for UDMA/66
ata8.04: ATAPI, max UDMA/66
ata8.04: applying bridge limits
ata8.04: qc timeout (cmd 0xef)
ata8.04: failed to set xfermode (err_mask=0x104)
ata8.04: limiting speed to UDMA/44
ata8: failed to recover some devices, retrying in 5 secs
ata8.04: hard resetting port
ata8.04: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
ata8.04: configured for UDMA/44
ata8: EH complete
ata8.02: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x2 frozen
ata8.02: tag 0 cmd 0xa0 Emask 0x4 stat 0x40 err 0x0 (timeout)
ata8.15: hard resetting port
ata8: controller in dubious state, performing PORT_RST
ata8.15: SATA link up 3.0 Gbps (SStatus 123 SControl 0)
ata8.00: hard resetting port
ata8.00: SATA link down (SStatus 0 SControl 310)
ata8.01: hard resetting port
ata8.01: SATA link down (SStatus 0 SControl 300)
ata8.02: hard resetting port
ata8.02: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
ata8.03: hard resetting port
ata8.03: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
ata8.04: hard resetting port
ata8.04: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
ata8.02: failed to set xfermode (err_mask=0x101)
ata8.02: limiting speed to UDMA/44
ata8.03: configured for UDMA/66
ata8.04: configured for UDMA/44
ata8: failed to recover some devices, retrying in 5 secs
ata8.02: hard resetting port
ata8.02: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
ata8.02: configured for UDMA/44
ata8: EH pending after completion, repeating EH (cnt=4)
ata8.04: exception Emask 0x2 SAct 0x0 SErr 0x0 action 0x2
ata8.04: (irq_stat 0x00060002, protocol mismatch)
ata8.04: soft resetting port
ata8.04: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
ata8.04: configured for UDMA/44
ata8: EH complete
  Vendor: _NEC      Model: DVD_RW ND-3550A   Rev: 1.G3
  Type:   CD-ROM                             ANSI SCSI revision: 05
 7:0:2:0: Attached scsi generic sg1 type 5
  Vendor: PLEXTOR   Model: DVDR   PX-755A    Rev: 1.03
  Type:   CD-ROM                             ANSI SCSI revision: 05
 7:0:3:0: Attached scsi generic sg2 type 5
  Vendor: PIONEER   Model: DVD-RW  DVR-111D  Rev: 1.23
  Type:   CD-ROM                             ANSI SCSI revision: 05
 7:0:4:0: Attached scsi generic sg3 type 5
sr0: scsi3-mmc drive: 48x/48x writer cd/rw xa/form2 cdda tray
Uniform CD-ROM driver Revision: 3.20
sr 7:0:2:0: Attached scsi CD-ROM sr0
sr1: scsi3-mmc drive: 40x/40x writer cd/rw xa/form2 cdda tray
sr 7:0:3:0: Attached scsi CD-ROM sr1
sr2: scsi3-mmc drive: 40x/40x writer cd/rw xa/form2 cdda tray
sr 7:0:4:0: Attached scsi CD-ROM sr2

not to get off topic, but

this was from SiI-DS-0113_3124-1_full.pdf

5.4.6 Interrupts and Command Completion

talked about the multi interrupt lines. 

Trent

-
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Filesystems]     [Linux SCSI]     [Linux RAID]     [Git]     [Kernel Newbies]     [Linux Newbie]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Samba]     [Device Mapper]

  Powered by Linux