sas_discover_event(port, DISCE_RESUME);
 }
 
+static void sas_form_port_add_phy(struct asd_sas_port *port,
+                                 struct asd_sas_phy *phy, bool wideport)
+{
+       list_add_tail(&phy->port_phy_el, &port->phy_list);
+       sas_phy_set_target(phy, port->port_dev);
+       phy->port = port;
+       port->num_phys++;
+       port->phy_mask |= (1U << phy->id);
+
+       if (wideport)
+               pr_debug("phy%d matched wide port%d\n", phy->id,
+                        port->id);
+       else
+               memcpy(port->sas_addr, phy->sas_addr, SAS_ADDR_SIZE);
+
+       if (*(u64 *)port->attached_sas_addr == 0) {
+               port->class = phy->class;
+               memcpy(port->attached_sas_addr, phy->attached_sas_addr,
+                      SAS_ADDR_SIZE);
+               port->iproto = phy->iproto;
+               port->tproto = phy->tproto;
+               port->oob_mode = phy->oob_mode;
+               port->linkrate = phy->linkrate;
+       } else {
+               port->linkrate = max(port->linkrate, phy->linkrate);
+       }
+}
+
 /**
  * sas_form_port - add this phy to a port
  * @phy: the phy of interest
        int i;
        struct sas_ha_struct *sas_ha = phy->ha;
        struct asd_sas_port *port = phy->port;
-       struct domain_device *port_dev;
+       struct domain_device *port_dev = NULL;
        struct sas_internal *si =
                to_sas_internal(sas_ha->core.shost->transportt);
        unsigned long flags;
                if (*(u64 *) port->sas_addr &&
                    phy_is_wideport_member(port, phy) && port->num_phys > 0) {
                        /* wide port */
-                       pr_debug("phy%d matched wide port%d\n", phy->id,
-                                port->id);
+                       port_dev = port->port_dev;
+                       sas_form_port_add_phy(port, phy, true);
+                       spin_unlock(&port->phy_list_lock);
                        break;
                }
                spin_unlock(&port->phy_list_lock);
                        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);
+                           && port->num_phys == 0) {
+                               port_dev = port->port_dev;
+                               sas_form_port_add_phy(port, phy, false);
+                               spin_unlock(&port->phy_list_lock);
                                break;
                        }
                        spin_unlock(&port->phy_list_lock);
                }
-       }
 
-       if (i >= sas_ha->num_phys) {
-               pr_err("%s: couldn't find a free port, bug?\n", __func__);
-               spin_unlock_irqrestore(&sas_ha->phy_port_lock, flags);
-               return;
+               if (i >= sas_ha->num_phys) {
+                       pr_err("%s: couldn't find a free port, bug?\n",
+                              __func__);
+                       spin_unlock_irqrestore(&sas_ha->phy_port_lock, flags);
+                       return;
+               }
        }
-
-       /* add the phy to the port */
-       port_dev = port->port_dev;
-       list_add_tail(&phy->port_phy_el, &port->phy_list);
-       sas_phy_set_target(phy, port_dev);
-       phy->port = port;
-       port->num_phys++;
-       port->phy_mask |= (1U << phy->id);
-
-       if (*(u64 *)port->attached_sas_addr == 0) {
-               port->class = phy->class;
-               memcpy(port->attached_sas_addr, phy->attached_sas_addr,
-                      SAS_ADDR_SIZE);
-               port->iproto = phy->iproto;
-               port->tproto = phy->tproto;
-               port->oob_mode = phy->oob_mode;
-               port->linkrate = phy->linkrate;
-       } else
-               port->linkrate = max(port->linkrate, phy->linkrate);
-       spin_unlock(&port->phy_list_lock);
        spin_unlock_irqrestore(&sas_ha->phy_port_lock, flags);
 
        if (!port->port) {