Skip to contentSkip to conversation

eSATA Drive Detection issues on mvsas

DISCUSSION Praveen Murali 2 participants 5 messages Oct 15, 2013 – Oct 17, 2013

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

Hi,
I have couple of external drives (Western Digital and Seagate) that
have an eSATA interface. My Linux box with a Marvell HBA (9445) running Ubuntu 12.04 with 3.2.48 kernel doest not seem to detect the drive. I tried with the latest upstream kernel and it behaves the same. But both the drives detect fine if I enter the mvsas BIOS during bootup. So I have hooked up a SATA analyzer and this is what I found
- When I tried to detect the drives in the mvsas BIOS, all the ATA commands that the bios issues have the port multiplier byte set to 0.
- If I bootup my Linux system and then connect the drives, the first IDENTIFY command has the port multiplier set to 0 (this one is successful) and the subsequent IDENTIFY command has port multiplier set to 1 (this one fails).
- If I connect any other SATA drives I have to the HBA, all the ATA commands have port multiplier set to 1 but they detects and work fine.

Just to rule out the port-multiplier possibility I changed the following line in drivers/scsi/libsas/sas_ata.c - fucntion sas_ata_qc_issue()

ata_tf_to_fis(&qc->tf, 1, 0, (u8*)&task->ata_task.fis);

to

ata_tf_to_fis(&qc->tf, 0, 0, (u8*)&task->ata_task.fis);

now all my drives seem to detect just fine. I believe, the eSATA interface on these external drives is a port multiplier, which is why the command fails. Also, the normal drives ignore this field thats why they work fine with port multiplier being set to either 0 or 1.

Question(s): Are my above assumtions correct? If so, what is the reasoning behind setting the port multiplier to 1 by default in libsas layer?

Thanks,
Praveen

#1 lore raw

Dan/James,
Can you please take a look at this and let me know if I am at the
right place? Or point me in the right direction? As I understand, this deost not look like an mvsas driver issue.

Thanks,
Praveen

Quoted 31 lines · Praveen Murali

Hi,
I have couple of external drives (Western Digital and Seagate) that
have an eSATA interface. My Linux box with a Marvell HBA (9445) running Ubuntu 12.04 with 3.2.48 kernel doest not seem to detect the drive. I tried with the latest upstream kernel and it behaves the same. But both the drives detect fine if I enter the mvsas BIOS during bootup. So I have hooked up a SATA analyzer and this is what I found
- When I tried to detect the drives in the mvsas BIOS, all the ATA
commands that the bios issues have the port multiplier byte set to 0.
- If I bootup my Linux system and then connect the drives, the first
IDENTIFY command has the port multiplier set to 0 (this one is successful) and the subsequent IDENTIFY command has port multiplier set to 1 (this one fails).
- If I connect any other SATA drives I have to the HBA, all the ATA
commands have port multiplier set to 1 but they detects and work fine.

Just to rule out the port-multiplier possibility I changed the following line in drivers/scsi/libsas/sas_ata.c - fucntion sas_ata_qc_issue()

ata_tf_to_fis(&qc->tf, 1, 0, (u8*)&task->ata_task.fis);

to

ata_tf_to_fis(&qc->tf, 0, 0, (u8*)&task->ata_task.fis);

now all my drives seem to detect just fine. I believe, the eSATA interface on these external drives is a port multiplier, which is why the command fails. Also, the normal drives ignore this field thats why they work fine with port multiplier being set to either 0 or 1.

Question(s): Are my above assumtions correct? If so, what is the reasoning behind setting the port multiplier to 1 by default in libsas layer?

Thanks,
Praveen

Signature · 3 lines
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
#2 lore raw
Quoted 5 lines · Praveen Murali

Dan/James,
Can you please take a look at this and let me know if I am at the right
place? Or point me in the right direction? As I understand, this deost not look like an mvsas driver issue.

Looks like a latent bug in libsas to me. Commit 110dd8f1 "[SCSI]
libsas: fix scr_read/write users and update the libata documentation" looks like a compile fix when the build was broken by commit 9977126c "libata: add @is_cmd to ata_tf_to_fis()" where libata changed the interface for ata_tf_to_fis(). We were passing 0 for pmp prior to that and changed to 1 here, probably a typo intending 'is_cmd to always be 1.

Somehow we have gotten away with is_cmd being 0? Does the following patch work for you:

drivers/scsi/libsas/sas_ata.c +0 -0
index 161c98efade9..d0fb99d5da95 100644
@@ -211,7 +211,7 @@ static unsigned int sas_ata_qc_issue(struct

ata_queued_cmd *qc)

                qc->tf.nsect = 0;
        }

- ata_tf_to_fis(&qc->tf, 1, 0, (u8*)&task->ata_task.fis);

+       ata_tf_to_fis(&qc->tf, qc->dev->link->pmp, 1, (u8*)&task->ata_task.fis);
        task->uldd_task = qc;
        if (ata_is_atapi(qc->tf.protocol)) {
                memcpy(task->ata_task.atapi_packet, qc->cdb, qc->dev->cdb_len);

That being said I don't think anybody has really checked out port-multiplier support on libsas, but we shouldn't be setting this bit by default.

--
Dan

Quoted 15 lines · Praveen Murali
Quoted 14 lines

Hi,
I have couple of external drives (Western Digital and Seagate) that have
an eSATA interface. My Linux box with a Marvell HBA (9445) running Ubuntu 12.04 with 3.2.48 kernel doest not seem to detect the drive. I tried with the latest upstream kernel and it behaves the same. But both the drives detect fine if I enter the mvsas BIOS during bootup. So I have hooked up a SATA analyzer and this is what I found
- When I tried to detect the drives in the mvsas BIOS, all the ATA commands that the bios issues have the port multiplier byte set to 0.
- If I bootup my Linux system and then connect the drives, the first IDENTIFY command has the port multiplier set to 0 (this one is successful) and the subsequent IDENTIFY command has port multiplier set to 1 (this one fails).

I assume the first IDENTIFY is coming from the BIOS, not Linux correct?

Quoted 25 lines
Quoted 25 lines

- If I connect any other SATA drives I have to the HBA, all the ATA commands have port multiplier set to 1 but they detects and work fine.

Just to rule out the port-multiplier possibility I changed the following line in drivers/scsi/libsas/sas_ata.c - fucntion sas_ata_qc_issue()

ata_tf_to_fis(&qc->tf, 1, 0, (u8*)&task->ata_task.fis);

to

ata_tf_to_fis(&qc->tf, 0, 0, (u8*)&task->ata_task.fis);

now all my drives seem to detect just fine. I believe, the eSATA interface on these external drives is a port multiplier, which is why the command fails. Also, the normal drives ignore this field thats why they work fine with port multiplier being set to either 0 or 1.

Question(s): Are my above assumtions correct? If so, what is the reasoning behind setting the port multiplier to 1 by default in libsas layer?

Thanks,
Praveen

#3 lore raw
Quoted 30 lines · Dan Williams
Quoted 5 lines · Praveen Murali

Dan/James,
Can you please take a look at this and let me know if I am at the right
place? Or point me in the right direction? As I understand, this deost not look like an mvsas driver issue.

Looks like a latent bug in libsas to me. Commit 110dd8f1 "[SCSI]
libsas: fix scr_read/write users and update the libata documentation" looks like a compile fix when the build was broken by commit 9977126c "libata: add @is_cmd to ata_tf_to_fis()" where libata changed the interface for ata_tf_to_fis(). We were passing 0 for pmp prior to that and changed to 1 here, probably a typo intending 'is_cmd to always be 1.

Somehow we have gotten away with is_cmd being 0? Does the following patch work for you:

drivers/scsi/libsas/sas_ata.c +1 -1
index 161c98efade9..d0fb99d5da95 100644
@@ -211,7 +211,7 @@ static unsigned int sas_ata_qc_issue(struct
 ata_queued_cmd *qc)
                 qc->tf.nsect = 0;
         }
 
-       ata_tf_to_fis(&qc->tf, 1, 0, (u8*)&task->ata_task.fis);
+       ata_tf_to_fis(&qc->tf, qc->dev->link->pmp, 1, (u8*)&task->ata_task.fis);
         task->uldd_task = qc;
         if (ata_is_atapi(qc->tf.protocol)) {
Quoted 2 lines
                 memcpy(task->ata_task.atapi_packet, qc->cdb, qc->dev->cdb_len);

Hi Dan,
I tested this patch and it works great!

Thanks,
Praveen

Quoted 53 lines

That being said I don't think anybody has really checked out port-multiplier support on libsas, but we shouldn't be setting this bit by default.

--
Dan

Quoted 6 lines · Praveen Murali
Quoted 5 lines

Hi,
I have couple of external drives (Western Digital and Seagate) that have
an eSATA interface. My Linux box with a Marvell HBA (9445) running Ubuntu 12.04 with 3.2.48 kernel doest not seem to detect the drive. I tried with the latest upstream kernel and it behaves the same. But both the drives

Quoted 8 lines
Quoted 8 lines

detect fine if I enter the mvsas BIOS during bootup. So I have hooked up a SATA analyzer and this is what I found
- When I tried to detect the drives in the mvsas BIOS, all the ATA commands that the bios issues have the port multiplier byte set to 0.
- If I bootup my Linux system and then connect the drives, the first IDENTIFY command has the port multiplier set to 0 (this one is successful) and the subsequent IDENTIFY command has port multiplier set to 1 (this one fails).

I assume the first IDENTIFY is coming from the BIOS, not Linux correct?

Quoted 17 lines
Quoted 17 lines

- If I connect any other SATA drives I have to the HBA, all the ATA commands have port multiplier set to 1 but they detects and work fine.

Just to rule out the port-multiplier possibility I changed the following line in drivers/scsi/libsas/sas_ata.c - fucntion sas_ata_qc_issue()

ata_tf_to_fis(&qc->tf, 1, 0, (u8*)&task->ata_task.fis);

to

ata_tf_to_fis(&qc->tf, 0, 0, (u8*)&task->ata_task.fis);

now all my drives seem to detect just fine. I believe, the eSATA interface on these external drives is a port multiplier, which is why the command fails. Also, the normal drives ignore this field thats why they work fine with port multiplier being set to either 0 or 1.

Quoted 8 lines
Quoted 8 lines

Question(s): Are my above assumtions correct? If so, what is the reasoning behind setting the port multiplier to 1 by default in libsas layer?

Thanks,
Praveen

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

#4 lore raw
Quoted 9 lines · Praveen Murali
Quoted 9 lines
drivers/scsi/libsas/sas_ata.c +0 -0
index 161c98efade9..d0fb99d5da95 100644
@@ -211,7 +211,7 @@ static unsigned int sas_ata_qc_issue(struct
 ata_queued_cmd *qc)
                 qc->tf.nsect = 0;
         }
 
Quoted 11 lines
Quoted 8 lines
drivers/scsi/libsas/sas_ata.c +1 -1
-       ata_tf_to_fis(&qc->tf, 1, 0, (u8*)&task->ata_task.fis);
+       ata_tf_to_fis(&qc->tf, qc->dev->link->pmp, 1,
 (u8*)&task->ata_task.fis);
         task->uldd_task = qc;
         if (ata_is_atapi(qc->tf.protocol)) {
                 memcpy(task->ata_task.atapi_packet, qc->cdb,

qc->dev->cdb_len);

Hi Dan,
I tested this patch and it works great!

Thanks! I'll send it up with your Reported-by and Tested-by.

--
Dan