* [PATCH] Lay groundwork for ATA port multiplier support
@ 2005-08-09 0:05 Edward Falk
2005-08-09 2:22 ` Jeff Garzik
2005-08-11 3:27 ` Jeff Garzik
0 siblings, 2 replies; 3+ messages in thread
From: Edward Falk @ 2005-08-09 0:05 UTC (permalink / raw)
To: Jeff Garzik, linux-ide, linux-kernel-daily-digest
[-- 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)
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] Lay groundwork for ATA port multiplier support
2005-08-09 0:05 [PATCH] Lay groundwork for ATA port multiplier support Edward Falk
@ 2005-08-09 2:22 ` Jeff Garzik
2005-08-11 3:27 ` Jeff Garzik
1 sibling, 0 replies; 3+ messages in thread
From: Jeff Garzik @ 2005-08-09 2:22 UTC (permalink / raw)
To: Edward Falk; +Cc: linux-ide, linux-kernel-daily-digest
On Mon, Aug 08, 2005 at 05:05:38PM -0700, Edward Falk wrote:
> This patch adds a few constants related to port multipliers to libata.h,
> hdreg.h, and libata-core.c
Looks good, save for one detail:
hdreg.h is deprecated, and we want to put new defines in
include/linux/ata.h (which can be shared between IDE driver and libata).
Jeff
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] Lay groundwork for ATA port multiplier support
2005-08-09 0:05 [PATCH] Lay groundwork for ATA port multiplier support Edward Falk
2005-08-09 2:22 ` Jeff Garzik
@ 2005-08-11 3:27 ` Jeff Garzik
1 sibling, 0 replies; 3+ messages in thread
From: Jeff Garzik @ 2005-08-11 3:27 UTC (permalink / raw)
To: Edward Falk; +Cc: linux-ide, linux-kernel-daily-digest
Edward Falk wrote:
> This patch adds a few constants related to port multipliers to libata.h,
> hdreg.h, and libata-core.c
In addition to my previous comment ("ata.h not hdreg.h"), grep for
ATA_DEV_ATA and ATA_DEV_ATAPI in the code.
There are a few cases where you see code like
if (class == ATA_DEV_ATA)
...
else
...
which assume that only found, identified devices make it to that point
in the code; ATA_DEV_NONE/UNKNOWN are guaranteed not to occur in that
code path simply due to other code rules.
Jeff
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2005-08-11 3:27 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-08-09 0:05 [PATCH] Lay groundwork for ATA port multiplier support Edward Falk
2005-08-09 2:22 ` Jeff Garzik
2005-08-11 3:27 ` Jeff Garzik
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).