All of lore.kernel.org
 help / color / mirror / Atom feed
From: Edward Falk <efalk@google.com>
To: Jeff Garzik <jgarzik@pobox.com>,
	linux-ide@vger.kernel.org,
	linux-kernel-daily-digest@lists.us.dell.com
Subject: [PATCH] Lay groundwork for ATA port multiplier support
Date: Mon, 08 Aug 2005 17:05:38 -0700	[thread overview]
Message-ID: <42F7F352.2080307@google.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 112 bytes --]

This patch adds a few constants related to port multipliers to libata.h, 
hdreg.h, and libata-core.c

	-ed falk

[-- Attachment #2: patch-pm --]
[-- Type: text/plain, Size: 6752 bytes --]

diff -urpN linux.git/drivers/scsi/libata-core.c linux.git.changed/drivers/scsi/libata-core.c
--- linux.git/drivers/scsi/libata-core.c	2005-08-08 16:52:03.000000000 -0700
+++ linux.git.changed/drivers/scsi/libata-core.c	2005-08-08 16:42:23.000000000 -0700
@@ -851,8 +851,8 @@ static unsigned int ata_devchk(struct at
  *	None.
  *
  *	RETURNS:
- *	Device type, %ATA_DEV_ATA, %ATA_DEV_ATAPI, or %ATA_DEV_UNKNOWN
- *	the event of failure.
+ *	Device type, %ATA_DEV_ATA, %ATA_DEV_ATAPI, %ATA_DEV_PM, or
+ *	%ATA_DEV_UNKNOWN in the event of failure.
  */
 
 unsigned int ata_dev_classify(struct ata_taskfile *tf)
@@ -868,12 +868,16 @@ unsigned int ata_dev_classify(struct ata
 		return ATA_DEV_ATA;
 	}
 
-	if (((tf->lbam == 0x14) && (tf->lbah == 0xeb)) ||
-	    ((tf->lbam == 0x69) && (tf->lbah == 0x96))) {
+	if ((tf->lbam == 0x14) && (tf->lbah == 0xeb)) {
 		DPRINTK("found ATAPI device by sig\n");
 		return ATA_DEV_ATAPI;
 	}
 
+	if ((tf->lbam == 0x69) && (tf->lbah == 0x96)) {
+		DPRINTK("found port multiplier by sig\n");
+		return ATA_DEV_PM;
+	}
+
 	DPRINTK("unknown device\n");
 	return ATA_DEV_UNKNOWN;
 }
@@ -1141,7 +1145,7 @@ static void ata_dev_identify(struct ata_
 	DPRINTK("ENTER, host %u, dev %u\n", ap->id, device);
 
 	assert (dev->class == ATA_DEV_ATA || dev->class == ATA_DEV_ATAPI ||
-		dev->class == ATA_DEV_NONE);
+		dev->class == ATA_DEV_PM || dev->class == ATA_DEV_NONE);
 
 	ata_dev_select(ap, device, 1, 1); /* select device 0/1 */
 
@@ -1396,6 +1400,9 @@ void ata_port_probe(struct ata_port *ap)
  *	PHY registers, to wake up the phy (and device), and
  *	clear any reset condition.
  *
+ *	If the reset times out, the port will be disabled.  This
+ *	function probably should not be called on non-SATA interfaces.
+ *
  *	LOCKING:
  *	PCI/etc. bus probe sem.
  *
@@ -1450,6 +1457,8 @@ void __sata_phy_reset(struct ata_port *a
  *	This function resets the SATA bus, and then probes
  *	the bus for devices.
  *
+ *	May be used as the phy_reset() entry in ata_port_operations.
+ *
  *	LOCKING:
  *	PCI/etc. bus probe sem.
  *
@@ -2238,11 +2247,17 @@ int ata_check_atapi_dma(struct ata_queue
 
 	return rc;
 }
+
+
 /**
  *	ata_qc_prep - Prepare taskfile for submission
  *	@qc: Metadata associated with taskfile to be prepared
  *
- *	Prepare ATA taskfile for submission.
+ *	Prepare ATA taskfile for submission.  Builds an IDE
+ *	scatter-gather list in memory for devices which support
+ *	standard PRD tables.
+ *
+ *	May be used as the qc_prep() entry in ata_port_operations.
  *
  *	LOCKING:
  *	spin_lock_irqsave(host_set lock)
@@ -2255,6 +2270,7 @@ void ata_qc_prep(struct ata_queued_cmd *
 	ata_fill_sg(qc);
 }
 
+
 /**
  *	ata_sg_init_one - Associate command with memory buffer
  *	@qc: Command to be associated
@@ -3134,6 +3125,11 @@ static inline int ata_should_dma_map(str
  *	area, filling in the S/G table, and finally
  *	writing the taskfile to hardware, starting the command.
  *
+ *	Calls the driver's qc_prep() and qc_issue() entry points.
+ *
+ *	Note: may NOT be used as the qc_issue() entry in
+ *	ata_port_operations.
+ *
  *	LOCKING:
  *	spin_lock_irqsave(host_set lock)
  *
@@ -3840,6 +3836,12 @@ err_out:
  *	This function requests irqs, probes the ATA bus, and probes
  *	the SCSI bus.
  *
+ *	For each port, this function executes a COMRESET, and a soft reset.
+ *	For each device on each port, it attempts an IDENTIFY DEVICE.
+ *
+ *	ata_device_add() is typically called from within the driver's
+ *	xxx_init_one() probe function.
+ *
  *	LOCKING:
  *	PCI/etc. bus probe sem.
  *
diff -urpN linux.git/include/linux/hdreg.h linux.git.changed/include/linux/hdreg.h
--- linux.git/include/linux/hdreg.h	2005-08-08 16:52:10.000000000 -0700
+++ linux.git.changed/include/linux/hdreg.h	2005-08-08 15:49:40.000000000 -0700
@@ -286,10 +286,12 @@ typedef struct hd_drive_hob_hdr {
 #define WIN_STANDBY			0xE2 /* Set device in Standby Mode */
 #define WIN_SETIDLE1			0xE3
 #define WIN_READ_BUFFER			0xE4 /* force read only 1 sector */
+#define WIN_READ_PORT_MULTIPLIER	0xE4 /* read port multiplier register */
 #define WIN_CHECKPOWERMODE1		0xE5
 #define WIN_SLEEPNOW1			0xE6
 #define WIN_FLUSH_CACHE			0xE7
 #define WIN_WRITE_BUFFER		0xE8 /* force write only 1 sector */
+#define WIN_WRITE_PORT_MULTIPLIER	0xE8 /* write port multiplier register */
 #define WIN_WRITE_SAME			0xE9 /* read ata-2 to use */
 	/* SET_FEATURES 0x22 or 0xDD */
 #define WIN_FLUSH_CACHE_EXT		0xEA /* 48-Bit */
@@ -370,6 +372,22 @@ typedef struct hd_drive_hob_hdr {
 #define SECURITY_FREEZE_LOCK		0xBE
 #define SECURITY_DISABLE_PASSWORD	0xBF
 
+
+/* Port multiplier registers */
+/* General registers (port 15) */
+#define	PM_GSCR_ID			0	/* Product Identifier */
+#define	PM_GSCR_REV			1	/* Revision Information */
+#define	PM_GSCR_PORT_INFO		2	/* Port Information */
+#define	PM_GSCR_ERRORS			32	/* Error Information */
+#define	PM_GSCR_ERROR_EN		33	/* Error Information Enable */
+#define	PM_GSCR_FEATURES		64	/* Optional Features Support */
+#define	PM_GSCR_FEATURE_EN		96	/* Optional Features Enable */
+/* Port registers (ports 0-14) */
+#define	PM_PSCR_STATUS			0	/* SStatus register */
+#define	PM_PSCR_SERROR			1	/* SError register */
+#define	PM_PSCR_SCONTROL		2	/* SControl register */
+#define	PM_PSCR_SACTIVE			4	/* SActive register */
+
 struct hd_geometry {
       unsigned char heads;
       unsigned char sectors;
diff -urpN linux.git/include/linux/libata.h linux.git.changed/include/linux/libata.h
--- linux.git/include/linux/libata.h	2005-08-08 16:52:11.000000000 -0700
+++ linux.git.changed/include/linux/libata.h	2005-08-08 15:45:32.000000000 -0700
@@ -101,7 +101,9 @@ enum {
 	ATA_DEV_ATA_UNSUP	= 2,	/* ATA device (unsupported) */
 	ATA_DEV_ATAPI		= 3,	/* ATAPI device */
 	ATA_DEV_ATAPI_UNSUP	= 4,	/* ATAPI device (unsupported) */
-	ATA_DEV_NONE		= 5,	/* no device */
+	ATA_DEV_PM		= 5,	/* Port Multiplier */
+	ATA_DEV_PM_UNSUP	= 6,	/* Port Multiplier (unsupported) */
+	ATA_DEV_NONE		= 7,	/* no device */
 
 	/* struct ata_port flags */
 	ATA_FLAG_SLAVE_POSS	= (1 << 1), /* host supports slave dev */
@@ -113,6 +115,8 @@ enum {
 	ATA_FLAG_MMIO		= (1 << 6), /* use MMIO, not PIO */
 	ATA_FLAG_SATA_RESET	= (1 << 7), /* use COMRESET */
 	ATA_FLAG_PIO_DMA	= (1 << 8), /* PIO cmds via DMA */
+	ATA_FLAG_PM_POSS	= (1 << 9), /* host supports port multiplier */
+
 
 	ATA_QCFLAG_ACTIVE	= (1 << 1), /* cmd not yet ack'd to scsi lyer */
 	ATA_QCFLAG_SG		= (1 << 3), /* have s/g table? */
@@ -460,7 +464,8 @@ static inline unsigned int ata_tag_valid
 static inline unsigned int ata_dev_present(struct ata_device *dev)
 {
 	return ((dev->class == ATA_DEV_ATA) ||
-		(dev->class == ATA_DEV_ATAPI));
+		(dev->class == ATA_DEV_ATAPI) ||
+		(dev->class == ATA_DEV_PM));
 }
 
 static inline u8 ata_chk_status(struct ata_port *ap)

             reply	other threads:[~2005-08-09  0:06 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-08-09  0:05 Edward Falk [this message]
2005-08-09  2:22 ` [PATCH] Lay groundwork for ATA port multiplier support Jeff Garzik
2005-08-11  3:27 ` Jeff Garzik

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=42F7F352.2080307@google.com \
    --to=efalk@google.com \
    --cc=jgarzik@pobox.com \
    --cc=linux-ide@vger.kernel.org \
    --cc=linux-kernel-daily-digest@lists.us.dell.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.