EM_CTL_RST                      = (1 << 9), /* Reset */
        EM_CTL_TM                       = (1 << 8), /* Transmit Message */
        EM_CTL_ALHD                     = (1 << 26), /* Activity LED */
+
+       /* em message type */
+       EM_MSG_TYPE_LED         = (1 << 0), /* LED */
+       EM_MSG_TYPE_SAFTE       = (1 << 1), /* SAF-TE */
+       EM_MSG_TYPE_SES2        = (1 << 2), /* SES-2 */
+       EM_MSG_TYPE_SGPIO       = (1 << 3), /* SGPIO */
 };
 
 struct ahci_cmd_hdr {
        u32                     saved_cap2;     /* saved initial cap2 */
        u32                     saved_port_map; /* saved initial port_map */
        u32                     em_loc; /* enclosure management location */
+       u32                     em_msg_type;    /* EM message type */
 };
 
-extern int ahci_em_messages;
 extern int ahci_ignore_sss;
 
 extern struct scsi_host_template ahci_sht;
 
 module_param(ahci_em_messages, int, 0444);
 /* add other LED protocol types when they become supported */
 MODULE_PARM_DESC(ahci_em_messages,
-       "Set AHCI Enclosure Management Message type (0 = disabled, 1 = LED");
+       "AHCI Enclosure Management Message control (0 = off, 1 = on)");
 
 static void ahci_enable_ahci(void __iomem *mmio)
 {
                return -EBUSY;
        }
 
-       /*
-        * create message header - this is all zero except for
-        * the message size, which is 4 bytes.
-        */
-       message[0] |= (4 << 8);
+       if (hpriv->em_msg_type & EM_MSG_TYPE_LED) {
+               /*
+                * create message header - this is all zero except for
+                * the message size, which is 4 bytes.
+                */
+               message[0] |= (4 << 8);
 
-       /* ignore 0:4 of byte zero, fill in port info yourself */
-       message[1] = ((state & ~EM_MSG_LED_HBA_PORT) | ap->port_no);
+               /* ignore 0:4 of byte zero, fill in port info yourself */
+               message[1] = ((state & ~EM_MSG_LED_HBA_PORT) | ap->port_no);
 
-       /* write message to EM_LOC */
-       writel(message[0], mmio + hpriv->em_loc);
-       writel(message[1], mmio + hpriv->em_loc+4);
+               /* write message to EM_LOC */
+               writel(message[0], mmio + hpriv->em_loc);
+               writel(message[1], mmio + hpriv->em_loc+4);
+
+               /*
+                * tell hardware to transmit the message
+                */
+               writel(em_ctl | EM_CTL_TM, mmio + HOST_EM_CTL);
+       }
 
        /* save off new led state for port/slot */
        emp->led_state = state;
 
-       /*
-        * tell hardware to transmit the message
-        */
-       writel(em_ctl | EM_CTL_TM, mmio + HOST_EM_CTL);
-
        spin_unlock_irqrestore(ap->lock, flags);
        return size;
 }
 
        messages = (em_ctl & EM_CTRL_MSG_TYPE) >> 16;
 
-       /* we only support LED message type right now */
-       if ((messages & 0x01) && (ahci_em_messages == 1)) {
+       if (messages) {
                /* store em_loc */
                hpriv->em_loc = ((em_loc >> 16) * 4);
+               hpriv->em_msg_type = messages;
                pi->flags |= ATA_FLAG_EM;
                if (!(em_ctl & EM_CTL_ALHD))
                        pi->flags |= ATA_FLAG_SW_ACTIVITY;