]> err.no Git - linux-2.6/commitdiff
[SCSI] sas: add flag for locally attached PHYs
authorChristoph Hellwig <hch@lst.de>
Wed, 19 Oct 2005 18:01:17 +0000 (20:01 +0200)
committerJames Bottomley <jejb@mulgrave.(none)>
Sat, 29 Oct 2005 00:06:45 +0000 (19:06 -0500)
Add a flag to mark a PHY as attached to the HBA as opposed to beeing on
an expander.  This is needed because various features are only supported
on those.  This is a crude hack, the proper fix would be to use
different classes for host-attached vs expander phys.  I'm looking into
that.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
drivers/message/fusion/mptsas.c
drivers/scsi/scsi_transport_sas.c
include/scsi/scsi_transport_sas.h

index 6512027bc69ad87ce3bba185671254e34d217273..dcdf0380be86e4dba183c86de0d404f33f3a62e8 100644 (file)
@@ -760,7 +760,7 @@ mptsas_parse_device_info(struct sas_identify *identify,
 }
 
 static int mptsas_probe_one_phy(struct device *dev,
-               struct mptsas_phyinfo *phy_info, int index)
+               struct mptsas_phyinfo *phy_info, int index, int local)
 {
        struct sas_phy *port;
        int error;
@@ -853,6 +853,9 @@ static int mptsas_probe_one_phy(struct device *dev,
                break;
        }
 
+       if (local)
+               port->local_attached = 1;
+
        error = sas_phy_add(port);
        if (error) {
                sas_phy_free(port);
@@ -918,7 +921,7 @@ mptsas_probe_hba_phys(MPT_ADAPTER *ioc, int *index)
                }
 
                mptsas_probe_one_phy(&ioc->sh->shost_gendev,
-                                    &port_info->phy_info[i], *index);
+                                    &port_info->phy_info[i], *index, 1);
                (*index)++;
        }
 
@@ -989,7 +992,8 @@ mptsas_probe_expander_phys(MPT_ADAPTER *ioc, u32 *handle, int *index)
                        }
                }
 
-               mptsas_probe_one_phy(parent, &port_info->phy_info[i], *index);
+               mptsas_probe_one_phy(parent, &port_info->phy_info[i],
+                                    *index, 0);
                (*index)++;
        }
 
index 63445f90097ebe72aecfb87454d29f37d41f1728..f5618c1116f43f8d122a95def3322e3f86c5f4b7 100644 (file)
@@ -266,6 +266,9 @@ show_sas_phy_##field(struct class_device *cdev, char *buf)          \
        struct sas_internal *i = to_sas_internal(shost->transportt);    \
        int error;                                                      \
                                                                        \
+       if (!phy->local_attached)                                       \
+               return -EINVAL;                                         \
+                                                                       \
        error = i->f->get_linkerrors(phy);                              \
        if (error)                                                      \
                return error;                                           \
index 38389d8dd56ea46764a548df51e1f47d818449a0..57eb68c6e9a796450f3c9549bc033601f9da09d9 100644 (file)
@@ -56,6 +56,9 @@ struct sas_phy {
        enum sas_linkrate       maximum_linkrate;
        u8                      port_identifier;
 
+       /* internal state */
+       unsigned int            local_attached : 1;
+
        /* link error statistics */
        u32                     invalid_dword_count;
        u32                     running_disparity_error_count;