diff options
Diffstat (limited to 'drivers/scsi/libsas/sas_port.c')
| -rw-r--r-- | 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 e6ac59c023f1..fe8b74c706d2 100644 --- a/drivers/scsi/libsas/sas_port.c +++ b/drivers/scsi/libsas/sas_port.c | |||
| @@ -56,7 +56,7 @@ static void sas_form_port(struct asd_sas_phy *phy) | |||
| 56 | } | 56 | } |
| 57 | } | 57 | } |
| 58 | 58 | ||
| 59 | /* find a port */ | 59 | /* see if the phy should be part of a wide port */ |
| 60 | spin_lock_irqsave(&sas_ha->phy_port_lock, flags); | 60 | spin_lock_irqsave(&sas_ha->phy_port_lock, flags); |
| 61 | for (i = 0; i < sas_ha->num_phys; i++) { | 61 | for (i = 0; i < sas_ha->num_phys; i++) { |
| 62 | port = sas_ha->sas_port[i]; | 62 | port = sas_ha->sas_port[i]; |
| @@ -69,12 +69,23 @@ static void sas_form_port(struct asd_sas_phy *phy) | |||
| 69 | SAS_DPRINTK("phy%d matched wide port%d\n", phy->id, | 69 | SAS_DPRINTK("phy%d matched wide port%d\n", phy->id, |
| 70 | port->id); | 70 | port->id); |
| 71 | break; | 71 | break; |
| 72 | } else if (*(u64 *) port->sas_addr == 0 && port->num_phys==0) { | ||
| 73 | memcpy(port->sas_addr, phy->sas_addr, SAS_ADDR_SIZE); | ||
| 74 | break; | ||
| 75 | } | 72 | } |
| 76 | spin_unlock(&port->phy_list_lock); | 73 | spin_unlock(&port->phy_list_lock); |
| 77 | } | 74 | } |
| 75 | /* The phy does not match any existing port, create a new one */ | ||
| 76 | if (i == sas_ha->num_phys) { | ||
| 77 | for (i = 0; i < sas_ha->num_phys; i++) { | ||
| 78 | port = sas_ha->sas_port[i]; | ||
| 79 | spin_lock(&port->phy_list_lock); | ||
| 80 | if (*(u64 *)port->sas_addr == 0 | ||
| 81 | && port->num_phys == 0) { | ||
| 82 | memcpy(port->sas_addr, phy->sas_addr, | ||
| 83 | SAS_ADDR_SIZE); | ||
| 84 | break; | ||
| 85 | } | ||
| 86 | spin_unlock(&port->phy_list_lock); | ||
| 87 | } | ||
| 88 | } | ||
| 78 | 89 | ||
| 79 | if (i >= sas_ha->num_phys) { | 90 | if (i >= sas_ha->num_phys) { |
| 80 | printk(KERN_NOTICE "%s: couldn't find a free port, bug?\n", | 91 | printk(KERN_NOTICE "%s: couldn't find a free port, bug?\n", |
