ahci: add "em_buffer" attribute for AHCI hosts
PATCH v3 1/1 ahci: add "em_buffer" attribute for AHCI hosts
Add "em_buffer" attribute for SATA AHCI hosts to provide a way for userland to access AHCI EM (enclosure management) buffer directly if the host supports EM.
AHCI driver should support SGPIO EM messages. However the SATA/AHCI specs did not define the SGPIO message format filled in EM buffer. Different HW vendors may have different definitions. The mainly purpose of this attribute is to solve this issue by allowing HW vendors to provide userland drivers and tools for their SGPIO initiators.
---
v2: rebase this patch on the new upstream branch of linux-next.git
v3: do not use "ahci_em_messages" module parameter as EM message type
control, instead by detecting supported types at initialization. Remove EM message structure shared with userland, insteady by simply writing the raw message into the buffer.
Move write function for this attribute from libata-scsi.c to libachi.c.
Add read function.
Add mecessary definitions for EM in ahci.h.
drivers/ata/ahci.c | 2 +- drivers/ata/ahci.h | 16 ++++--- drivers/ata/libahci.c | 115 +++++++++++++++++++++++++++++++++++++++++++------ 3 files changed, 112 insertions(+), 21 deletions(-)
drivers/ata/ahci.c +1 -1
@@ -1185,7 +1185,7 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)/* set enclosure management message type */ if (ap->flags &ATA_FLAG_EM ) - ap->em_message_type = ahci_em_messages; + ap->em_message_type = hpriv->em_msg_type;/* disabled/not-implemented port */
drivers/ata/ahci.h +10 -6
@@ -220,13 +220,16 @@ enum {ICH_MAP =0x90 ,/* ICH MAP register */ /* em constants */ -EM_MAX_SLOTS =8 , -EM_MAX_RETRY =5 , +EM_MAX_SLOTS =8 , +EM_MAX_RETRY =5 ,/* em_ctl bits */ -EM_CTL_RST = (1 <<9 ),/* Reset */ -EM_CTL_TM = (1 <<8 ),/* Transmit Message */ - EM_CTL_ALHD = (1 << 26), /* Activity LED */ +EM_CTL_RST = (1 <<9 ),/* Reset */ +EM_CTL_TM = (1 <<8 ),/* Transmit Message */ +EM_CTL_MR = (1 <<0 ),/* Message Recieved */ +EM_CTL_ALHD = (1 <<26 ),/* Activity LED */ +EM_CTL_XMT = (1 <<25 ),/* Transmit Only */ + EM_CTL_SMB = (1 << 24), /* Single Message Buffer */ }; struct ahci_cmd_hdr {
@@ -282,9 +285,10 @@ struct ahci_host_priv {u32 saved_cap2;/* saved initial cap2 */ u32 saved_port_map;/* saved initial port_map */ u32 em_loc;/* enclosure management location */ +u32 em_buf_sz;/* EM buffer size in byte*/ +u32 em_msg_type;/* EM message type */ }; -extern int ahci_em_messages;extern int ahci_ignore_sss;extern struct scsi_host_template ahci_sht;
drivers/ata/libahci.c +101 -14
165 lines not on this page · raw message
Signature · 1 line
1.6.4.2
drivers/ata/libahci.c void ahci_set_em_messages(struct ahci_host_priv *hpriv, · line 2179
Quoted 7 lines · Harry Zhang
drivers/ata/libahci.c +0
-1@@ -2088,16 +2175,16 @@ void ahci_set_em_messages(struct ahci_host_priv *hpriv,void __iomem *mmio = hpriv->mmio;u32 em_loc =readl (mmio +HOST_EM_LOC );u32 em_ctl =readl (mmio +HOST_EM_CTL ); -[PATCH v3] ahci: add "em_buffer" attribute for AHCI hostsif (!ahci_em_messages || !(hpriv->cap &HOST_CAP_EMS ))return ;
?????? Can you please regenerate the patch against a clean #upstream tree?
Signature · 1 line
tejun