>From 24abd7f05d2293e03aacbdd9d620d6378ea5e2aa Mon Sep 17 00:00:00 2001 From: Tom Peng <tom_peng@xxxxxxxxx> Date: Wed, 1 Jul 2009 19:04:01 +0800 Subject: [PATCH 3/5] reuse the original port when reenable the phy in a port Signed-off-by: Tom Peng <tom_peng@xxxxxxxxx> Signed-off-by: Jack Wang <jack_wang@xxxxxxxxx> Signed-off-by: Lindar Liu <lindar_liu@xxxxxxxxx> --- drivers/scsi/libsas/sas_port.c | 19 +++++++++++++++---- 1 files changed, 15 insertions(+), 4 deletions(-) diff --git a/drivers/scsi/libsas/sas_port.c b/drivers/scsi/libsas/sas_port.c index e6ac59c..5aad165 100644 --- a/drivers/scsi/libsas/sas_port.c +++ b/drivers/scsi/libsas/sas_port.c @@ -69,16 +69,27 @@ static void sas_form_port(struct asd_sas_phy *phy) SAS_DPRINTK("phy%d matched wide port%d\n", phy->id, port->id); break; - } else if (*(u64 *) port->sas_addr == 0 && port->num_phys==0) { - memcpy(port->sas_addr, phy->sas_addr, SAS_ADDR_SIZE); - break; } spin_unlock(&port->phy_list_lock); } + /* The phy does not match any port currently existed, create new one */ + if (i == sas_ha->num_phys) { + for (i = 0; i < sas_ha->num_phys; i++) { + port = sas_ha->sas_port[i]; + spin_lock(&port->phy_list_lock); + if (*(u64 *)port->sas_addr == 0 + && port->num_phys == 0) { + memcpy(port->sas_addr, phy->sas_addr, + SAS_ADDR_SIZE); + break; + } + spin_unlock(&port->phy_list_lock); + } + } if (i >= sas_ha->num_phys) { printk(KERN_NOTICE "%s: couldn't find a free port, bug?\n", - __func__); + __func__); spin_unlock_irqrestore(&sas_ha->phy_port_lock, flags); return; } --
Attachment:
0003-reuse-the-original-port-when-reenable-the-phy-in-a-p.patch
Description: Binary data