Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 293030
b: refs/heads/master
c: 899fcf4
h: refs/heads/master
v: v3
  • Loading branch information
Dan Williams authored and James Bottomley committed Feb 29, 2012
1 parent 5673943 commit 3d17f4a
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 5 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 9a10b33caf78f897356ac006c455e6060a40af15
refs/heads/master: 899fcf40f3177697ccfb029d0484cb8ec09a51ca
12 changes: 8 additions & 4 deletions trunk/drivers/scsi/libsas/sas_discover.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,6 @@ void sas_init_dev(struct domain_device *dev)
*/
static int sas_get_port_device(struct asd_sas_port *port)
{
unsigned long flags;
struct asd_sas_phy *phy;
struct sas_rphy *rphy;
struct domain_device *dev;
Expand All @@ -78,9 +77,9 @@ static int sas_get_port_device(struct asd_sas_port *port)
if (!dev)
return -ENOMEM;

spin_lock_irqsave(&port->phy_list_lock, flags);
spin_lock_irq(&port->phy_list_lock);
if (list_empty(&port->phy_list)) {
spin_unlock_irqrestore(&port->phy_list_lock, flags);
spin_unlock_irq(&port->phy_list_lock);
sas_put_device(dev);
return -ENODEV;
}
Expand All @@ -89,7 +88,7 @@ static int sas_get_port_device(struct asd_sas_port *port)
memcpy(dev->frame_rcvd, phy->frame_rcvd, min(sizeof(dev->frame_rcvd),
(size_t)phy->frame_rcvd_size));
spin_unlock(&phy->frame_rcvd_lock);
spin_unlock_irqrestore(&port->phy_list_lock, flags);
spin_unlock_irq(&port->phy_list_lock);

if (dev->frame_rcvd[0] == 0x34 && port->oob_mode == SATA_OOB_MODE) {
struct dev_to_host_fis *fis =
Expand Down Expand Up @@ -134,6 +133,11 @@ static int sas_get_port_device(struct asd_sas_port *port)
sas_put_device(dev);
return -ENODEV;
}

spin_lock_irq(&port->phy_list_lock);
list_for_each_entry(phy, &port->phy_list, port_phy_el)
sas_phy_set_target(phy, dev);
spin_unlock_irq(&port->phy_list_lock);
rphy->identify.phy_identifier = phy->phy->identify.phy_identifier;
memcpy(dev->sas_addr, port->attached_sas_addr, SAS_ADDR_SIZE);
sas_fill_in_rphy(dev, rphy);
Expand Down
17 changes: 17 additions & 0 deletions trunk/drivers/scsi/libsas/sas_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
#include <scsi/scsi_host.h>
#include <scsi/scsi_transport_sas.h>
#include <scsi/libsas.h>
#include <scsi/sas_ata.h>

#define sas_printk(fmt, ...) printk(KERN_NOTICE "sas: " fmt, ## __VA_ARGS__)

Expand Down Expand Up @@ -147,6 +148,22 @@ static inline void sas_fill_in_rphy(struct domain_device *dev,
}
}

static inline void sas_phy_set_target(struct asd_sas_phy *p, struct domain_device *dev)
{
struct sas_phy *phy = p->phy;

if (dev) {
if (dev_is_sata(dev))
phy->identify.device_type = SAS_END_DEVICE;
else
phy->identify.device_type = dev->dev_type;
phy->identify.target_port_protocols = dev->tproto;
} else {
phy->identify.device_type = SAS_PHY_UNUSED;
phy->identify.target_port_protocols = 0;
}
}

static inline void sas_add_parent_port(struct domain_device *dev, int phy_id)
{
struct expander_device *ex = &dev->ex_dev;
Expand Down
2 changes: 2 additions & 0 deletions trunk/drivers/scsi/libsas/sas_port.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ static void sas_form_port(struct asd_sas_phy *phy)

/* add the phy to the port */
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);
Expand Down Expand Up @@ -182,6 +183,7 @@ void sas_deform_port(struct asd_sas_phy *phy, int gone)
spin_lock(&port->phy_list_lock);

list_del_init(&phy->port_phy_el);
sas_phy_set_target(phy, NULL);
phy->port = NULL;
port->num_phys--;
port->phy_mask &= ~(1U << phy->id);
Expand Down

0 comments on commit 3d17f4a

Please sign in to comment.