Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 254400
b: refs/heads/master
c: 4393aa4
h: refs/heads/master
v: v3
  • Loading branch information
Dan Williams committed Jul 3, 2011
1 parent 7164e59 commit c18d292
Show file tree
Hide file tree
Showing 10 changed files with 95 additions and 220 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: 037afc7812e2b202fbc18218e6c0eff34dad36ed
refs/heads/master: 4393aa4e6b9517a666f0ef6b774fd421a9dc4c68
4 changes: 2 additions & 2 deletions trunk/drivers/scsi/isci/host.c
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ void isci_host_start_complete(struct isci_host *ihost, enum sci_status completio

int isci_host_scan_finished(struct Scsi_Host *shost, unsigned long time)
{
struct isci_host *ihost = isci_host_from_sas_ha(SHOST_TO_SAS_HA(shost));
struct isci_host *ihost = SHOST_TO_SAS_HA(shost)->lldd_ha;

if (test_bit(IHOST_START_PENDING, &ihost->flags))
return 0;
Expand All @@ -149,7 +149,7 @@ int isci_host_scan_finished(struct Scsi_Host *shost, unsigned long time)

void isci_host_scan_start(struct Scsi_Host *shost)
{
struct isci_host *ihost = isci_host_from_sas_ha(SHOST_TO_SAS_HA(shost));
struct isci_host *ihost = SHOST_TO_SAS_HA(shost)->lldd_ha;
struct scic_sds_controller *scic = ihost->core_controller;
unsigned long tmo = scic_controller_get_suggested_start_timeout(scic);

Expand Down
13 changes: 4 additions & 9 deletions trunk/drivers/scsi/isci/host.h
Original file line number Diff line number Diff line change
Expand Up @@ -233,15 +233,10 @@ static inline void wait_for_device_stop(struct isci_host *ihost, struct isci_rem
wait_event(ihost->eventq, !test_bit(IDEV_STOP_PENDING, &idev->flags));
}

/**
* isci_host_from_sas_ha() - This accessor retrieves the isci_host object
* reference from the Linux sas_ha_struct reference.
* @ha_struct,: This parameter points to the Linux sas_ha_struct object
*
* A reference to the associated isci_host structure.
*/
#define isci_host_from_sas_ha(ha_struct) \
((struct isci_host *)(ha_struct)->lldd_ha)
static inline struct isci_host *dev_to_ihost(struct domain_device *dev)
{
return dev->port->ha->lldd_ha;
}

/**
* isci_host_scan_finished() -
Expand Down
2 changes: 1 addition & 1 deletion trunk/drivers/scsi/isci/phy.c
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ int isci_phy_control(struct asd_sas_phy *sas_phy,
return -ENODEV;

/* Perform the port reset. */
ret = isci_port_perform_hard_reset(iport, iphy);
ret = isci_port_perform_hard_reset(ihost, iport, iphy);

break;

Expand Down
68 changes: 24 additions & 44 deletions trunk/drivers/scsi/isci/port.c
Original file line number Diff line number Diff line change
Expand Up @@ -400,75 +400,56 @@ void isci_port_hard_reset_complete(struct isci_port *isci_port,

complete_all(&isci_port->hard_reset_complete);
}
/**
* isci_port_perform_hard_reset() - This function is one of the SAS Domain
* Template functions. This is a phy management function.
* @isci_port:
* @isci_phy:
*
* status, TMF_RESP_FUNC_COMPLETE indicates success.
*/
int isci_port_perform_hard_reset(
struct isci_port *isci_port,
struct isci_phy *isci_phy)

int isci_port_perform_hard_reset(struct isci_host *ihost, struct isci_port *iport,
struct isci_phy *iphy)
{
unsigned long flags;
enum sci_status status;
int ret = TMF_RESP_FUNC_COMPLETE;
unsigned long flags;

dev_dbg(&ihost->pdev->dev, "%s: iport = %p\n",
__func__, iport);

dev_dbg(&isci_port->isci_host->pdev->dev,
"%s: isci_port = %p\n",
__func__, isci_port);

BUG_ON(isci_port == NULL);

init_completion(&isci_port->hard_reset_complete);
init_completion(&iport->hard_reset_complete);

spin_lock_irqsave(&isci_port->isci_host->scic_lock, flags);
spin_lock_irqsave(&ihost->scic_lock, flags);

#define ISCI_PORT_RESET_TIMEOUT SCIC_SDS_SIGNATURE_FIS_TIMEOUT
status = scic_port_hard_reset(isci_port->sci_port_handle,
status = scic_port_hard_reset(iport->sci_port_handle,
ISCI_PORT_RESET_TIMEOUT);

spin_unlock_irqrestore(&isci_port->isci_host->scic_lock, flags);
spin_unlock_irqrestore(&ihost->scic_lock, flags);

if (status == SCI_SUCCESS) {
wait_for_completion(&isci_port->hard_reset_complete);
wait_for_completion(&iport->hard_reset_complete);

dev_dbg(&isci_port->isci_host->pdev->dev,
"%s: isci_port = %p; hard reset completion\n",
__func__, isci_port);
dev_dbg(&ihost->pdev->dev,
"%s: iport = %p; hard reset completion\n",
__func__, iport);

if (isci_port->hard_reset_status != SCI_SUCCESS)
if (iport->hard_reset_status != SCI_SUCCESS)
ret = TMF_RESP_FUNC_FAILED;
} else {
ret = TMF_RESP_FUNC_FAILED;

dev_err(&isci_port->isci_host->pdev->dev,
"%s: isci_port = %p; scic_port_hard_reset call"
dev_err(&ihost->pdev->dev,
"%s: iport = %p; scic_port_hard_reset call"
" failed 0x%x\n",
__func__, isci_port, status);
__func__, iport, status);

}

/* If the hard reset for the port has failed, consider this
* the same as link failures on all phys in the port.
*/
if (ret != TMF_RESP_FUNC_COMPLETE) {
BUG_ON(isci_port->isci_host == NULL);

dev_err(&isci_port->isci_host->pdev->dev,
"%s: isci_port = %p; hard reset failed "
dev_err(&ihost->pdev->dev,
"%s: iport = %p; hard reset failed "
"(0x%x) - sending link down to libsas for phy %p\n",
__func__,
isci_port,
isci_port->hard_reset_status,
isci_phy);

isci_port_link_down(isci_port->isci_host,
isci_phy,
isci_port);
__func__, iport, iport->hard_reset_status, iphy);

isci_port_link_down(ihost, iphy, iport);
}

return ret;
Expand All @@ -491,8 +472,7 @@ void isci_port_invalid_link_up(struct scic_sds_controller *scic,
struct scic_sds_port *sci_port,
struct scic_sds_phy *phy)
{
struct isci_host *ihost =
(struct isci_host *)sci_object_get_association(scic);
struct isci_host *ihost = sci_object_get_association(scic);

dev_warn(&ihost->pdev->dev, "Invalid link up!\n");
}
Expand Down
5 changes: 2 additions & 3 deletions trunk/drivers/scsi/isci/port.h
Original file line number Diff line number Diff line change
Expand Up @@ -143,9 +143,8 @@ void isci_port_hard_reset_complete(
struct isci_port *isci_port,
enum sci_status completion_status);

int isci_port_perform_hard_reset(
struct isci_port *isci_port_ptr,
struct isci_phy *isci_phy_ptr);
int isci_port_perform_hard_reset(struct isci_host *ihost, struct isci_port *iport,
struct isci_phy *iphy);

void isci_port_invalid_link_up(
struct scic_sds_controller *scic,
Expand Down
70 changes: 17 additions & 53 deletions trunk/drivers/scsi/isci/remote_device.c
Original file line number Diff line number Diff line change
Expand Up @@ -218,33 +218,20 @@ static enum sci_status isci_remote_device_construct(
return status;
}


/**
* isci_remote_device_nuke_requests() - This function terminates all requests
* for a given remote device.
* @isci_device: This parameter specifies the remote device
*
*/
void isci_remote_device_nuke_requests(
struct isci_remote_device *isci_device)
void isci_remote_device_nuke_requests(struct isci_host *ihost, struct isci_remote_device *idev)
{
DECLARE_COMPLETION_ONSTACK(aborted_task_completion);
struct isci_host *isci_host;

isci_host = isci_device->isci_port->isci_host;

dev_dbg(&isci_host->pdev->dev,
"%s: isci_device = %p\n", __func__, isci_device);
dev_dbg(&ihost->pdev->dev,
"%s: idev = %p\n", __func__, idev);

/* Cleanup all requests pending for this device. */
isci_terminate_pending_requests(isci_host, isci_device, terminating);
isci_terminate_pending_requests(ihost, idev, terminating);

dev_dbg(&isci_host->pdev->dev,
"%s: isci_device = %p, done\n", __func__, isci_device);
dev_dbg(&ihost->pdev->dev,
"%s: idev = %p, done\n", __func__, idev);
}



/**
* This function builds the isci_remote_device when a libsas dev_found message
* is received.
Expand Down Expand Up @@ -380,7 +367,7 @@ enum sci_status isci_remote_device_stop(struct isci_host *ihost, struct isci_rem
isci_remote_device_change_state(idev, isci_stopping);

/* Kill all outstanding requests. */
isci_remote_device_nuke_requests(idev);
isci_remote_device_nuke_requests(ihost, idev);

set_bit(IDEV_STOP_PENDING, &idev->flags);

Expand Down Expand Up @@ -409,7 +396,7 @@ enum sci_status isci_remote_device_stop(struct isci_host *ihost, struct isci_rem
*/
void isci_remote_device_gone(struct domain_device *dev)
{
struct isci_host *ihost = dev->port->ha->lldd_ha;
struct isci_host *ihost = dev_to_ihost(dev);
struct isci_remote_device *idev = dev->lldd_dev;

dev_dbg(&ihost->pdev->dev,
Expand All @@ -431,16 +418,14 @@ void isci_remote_device_gone(struct domain_device *dev)
*/
int isci_remote_device_found(struct domain_device *domain_dev)
{
struct isci_host *isci_host;
struct isci_host *isci_host = dev_to_ihost(domain_dev);
struct isci_port *isci_port;
struct isci_phy *isci_phy;
struct asd_sas_port *sas_port;
struct asd_sas_phy *sas_phy;
struct isci_remote_device *isci_device;
enum sci_status status;

isci_host = isci_host_from_sas_ha(domain_dev->port->ha);

dev_dbg(&isci_host->pdev->dev,
"%s: domain_device = %p\n", __func__, domain_dev);

Expand Down Expand Up @@ -556,41 +541,22 @@ bool isci_device_is_reset_pending(
*
* true if there is a reset pending for the device.
*/
void isci_device_clear_reset_pending(struct isci_remote_device *isci_device)
void isci_device_clear_reset_pending(struct isci_host *ihost, struct isci_remote_device *idev)
{
struct isci_request *isci_request;
struct isci_request *tmp_req;
struct isci_host *isci_host = NULL;
unsigned long flags = 0;

/* FIXME more port gone confusion, and this time it makes the
* locking "fun"
*/
if (isci_device->isci_port != NULL)
isci_host = isci_device->isci_port->isci_host;

/*
* FIXME when the isci_host gets sorted out
* use dev_dbg()
*/
pr_debug("%s: isci_device=%p, isci_host=%p\n",
__func__, isci_device, isci_host);
dev_dbg(&ihost->pdev->dev, "%s: idev=%p, ihost=%p\n",
__func__, idev, ihost);

if (isci_host != NULL)
spin_lock_irqsave(&isci_host->scic_lock, flags);
else
pr_err("%s: isci_device %p; isci_host == NULL!\n",
__func__, isci_device);
spin_lock_irqsave(&ihost->scic_lock, flags);

/* Clear reset pending on all pending requests. */
list_for_each_entry_safe(isci_request, tmp_req,
&isci_device->reqs_in_process, dev_node) {
/*
* FIXME when the conditional spinlock is gone
* change to dev_dbg()
*/
pr_debug("%s: isci_device = %p request = %p\n",
__func__, isci_device, isci_request);
&idev->reqs_in_process, dev_node) {
dev_dbg(&ihost->pdev->dev, "%s: idev = %p request = %p\n",
__func__, idev, isci_request);

if (isci_request->ttype == io_task) {

Expand All @@ -603,9 +569,7 @@ void isci_device_clear_reset_pending(struct isci_remote_device *isci_device)
spin_unlock_irqrestore(&task->task_state_lock, flags2);
}
}

if (isci_host != NULL)
spin_unlock_irqrestore(&isci_host->scic_lock, flags);
spin_unlock_irqrestore(&ihost->scic_lock, flags);
}

/**
Expand Down
62 changes: 16 additions & 46 deletions trunk/drivers/scsi/isci/remote_device.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,59 +78,29 @@ static inline struct scic_sds_remote_device *to_sci_dev(struct isci_remote_devic
return (struct scic_sds_remote_device *) &idev[1];
}

#define to_isci_remote_device(p) \
container_of(p, struct isci_remote_device, sci_remote_device);

#define ISCI_REMOTE_DEVICE_START_TIMEOUT 5000


/**
* isci_dev_from_domain_dev() - This accessor retrieves the remote_device
* object reference from the Linux domain_device reference.
* @domdev,: This parameter points to the Linux domain_device object .
*
* A reference to the associated isci remote device.
*/
#define isci_dev_from_domain_dev(domdev) \
((struct isci_remote_device *)(domdev)->lldd_dev)

void isci_remote_device_start_complete(
struct isci_host *,
struct isci_remote_device *,
enum sci_status);

void isci_remote_device_stop_complete(
struct isci_host *,
struct isci_remote_device *,
enum sci_status);

void isci_remote_device_start_complete(struct isci_host *ihost,
struct isci_remote_device *idev,
enum sci_status);
void isci_remote_device_stop_complete(struct isci_host *ihost,
struct isci_remote_device *idev,
enum sci_status);
enum sci_status isci_remote_device_stop(struct isci_host *ihost,
struct isci_remote_device *idev);
void isci_remote_device_nuke_requests(
struct isci_remote_device *isci_device);

void isci_remote_device_nuke_requests(struct isci_host *ihost,
struct isci_remote_device *idev);
void isci_remote_device_ready(struct isci_host *ihost,
struct isci_remote_device *idev);

void isci_remote_device_not_ready(struct isci_host *ihost,
struct isci_remote_device *idev, u32 reason);

void isci_remote_device_gone(
struct domain_device *domain_dev);

int isci_remote_device_found(
struct domain_device *domain_dev);

bool isci_device_is_reset_pending(
struct isci_host *isci_host,
struct isci_remote_device *isci_device);

void isci_device_clear_reset_pending(
struct isci_remote_device *isci_device);

void isci_remote_device_change_state(
struct isci_remote_device *isci_device,
enum isci_status status);
void isci_remote_device_gone(struct domain_device *domain_dev);
int isci_remote_device_found(struct domain_device *domain_dev);
bool isci_device_is_reset_pending(struct isci_host *ihost,
struct isci_remote_device *idev);
void isci_device_clear_reset_pending(struct isci_host *ihost,
struct isci_remote_device *idev);
void isci_remote_device_change_state(struct isci_remote_device *idev,
enum isci_status status);

#endif /* !defined(_ISCI_REMOTE_DEVICE_H_) */

2 changes: 1 addition & 1 deletion trunk/drivers/scsi/isci/request.c
Original file line number Diff line number Diff line change
Expand Up @@ -379,7 +379,7 @@ int isci_request_execute(
struct isci_request *request;
unsigned long flags;

isci_device = isci_dev_from_domain_dev(task->dev);
isci_device = task->dev->lldd_dev;
sci_device = to_sci_dev(isci_device);

/* do common allocation and init of request object. */
Expand Down
Loading

0 comments on commit c18d292

Please sign in to comment.