From cbc11701dd96e649bafade02ade896df3f4d04a6 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Fri, 1 Oct 2010 13:55:52 -0700 Subject: [PATCH] --- yaml --- r: 226747 b: refs/heads/master c: 00f0254ed9b19164d416dc2e3c2e81eda55a6faf h: refs/heads/master i: 226745: d8329b609071c2aad05b2f525c34d5c7e5d38718 226743: 827f11aa5ba9f16c9a64ea5f52720c4701a8d484 v: v3 --- [refs] | 2 +- trunk/drivers/scsi/libsas/sas_port.c | 18 +++++++++++++----- trunk/include/scsi/libsas.h | 2 ++ 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/[refs] b/[refs] index 3cef624b33ce..e7c6d44aa085 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 3ff5588d3f8afad65ded52ac0e4191462fe034cb +refs/heads/master: 00f0254ed9b19164d416dc2e3c2e81eda55a6faf diff --git a/trunk/drivers/scsi/libsas/sas_port.c b/trunk/drivers/scsi/libsas/sas_port.c index fe8b74c706d2..5257fdfe699a 100644 --- a/trunk/drivers/scsi/libsas/sas_port.c +++ b/trunk/drivers/scsi/libsas/sas_port.c @@ -28,6 +28,17 @@ #include #include "../scsi_sas_internal.h" +static bool phy_is_wideport_member(struct asd_sas_port *port, struct asd_sas_phy *phy) +{ + struct sas_ha_struct *sas_ha = phy->ha; + + if (memcmp(port->attached_sas_addr, phy->attached_sas_addr, + SAS_ADDR_SIZE) != 0 || (sas_ha->strict_wide_ports && + memcmp(port->sas_addr, phy->sas_addr, SAS_ADDR_SIZE) != 0)) + return false; + return true; +} + /** * sas_form_port -- add this phy to a port * @phy: the phy of interest @@ -45,8 +56,7 @@ static void sas_form_port(struct asd_sas_phy *phy) unsigned long flags; if (port) { - if (memcmp(port->attached_sas_addr, phy->attached_sas_addr, - SAS_ADDR_SIZE) != 0) + if (!phy_is_wideport_member(port, phy)) sas_deform_port(phy); else { SAS_DPRINTK("%s: phy%d belongs to port%d already(%d)!\n", @@ -62,9 +72,7 @@ static void sas_form_port(struct asd_sas_phy *phy) port = sas_ha->sas_port[i]; spin_lock(&port->phy_list_lock); if (*(u64 *) port->sas_addr && - memcmp(port->attached_sas_addr, - phy->attached_sas_addr, SAS_ADDR_SIZE) == 0 && - port->num_phys > 0) { + phy_is_wideport_member(port, phy) && port->num_phys > 0) { /* wide port */ SAS_DPRINTK("phy%d matched wide port%d\n", phy->id, port->id); diff --git a/trunk/include/scsi/libsas.h b/trunk/include/scsi/libsas.h index 90ce527ecf3d..8f6bb9c7f3eb 100644 --- a/trunk/include/scsi/libsas.h +++ b/trunk/include/scsi/libsas.h @@ -361,6 +361,8 @@ struct sas_ha_struct { /* The class calls this to send a task for execution. */ int lldd_max_execute_num; int lldd_queue_size; + int strict_wide_ports; /* both sas_addr and attached_sas_addr must match + * their siblings when forming wide ports */ /* LLDD calls these to notify the class of an event. */ void (*notify_ha_event)(struct sas_ha_struct *, enum ha_event);