Skip to content

Commit

Permalink
[SCSI] pm8001: Fixes for tag alloc, error goto and code cleanup
Browse files Browse the repository at this point in the history
Allocate right size for bitmap tag,fix error goto and cleanup print
message and undocable commemts. patch attached.

Signed-off-by: Lindar Liu <lindar_liu@usish.com>
Signed-off-by: Jack Wang <jack_wang@usish.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
  • Loading branch information
jack_wang authored and James Bottomley committed Dec 4, 2009
1 parent 72d0baa commit 97ee208
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 35 deletions.
11 changes: 7 additions & 4 deletions drivers/scsi/pm8001/pm8001_init.c
Original file line number Diff line number Diff line change
Expand Up @@ -203,9 +203,9 @@ static int __devinit pm8001_alloc(struct pm8001_hba_info *pm8001_ha)
for (i = 0; i < pm8001_ha->chip->n_phy; i++)
pm8001_phy_init(pm8001_ha, i);

pm8001_ha->tags = kmalloc(sizeof(*pm8001_ha->tags)*PM8001_MAX_DEVICES,
GFP_KERNEL);

pm8001_ha->tags = kzalloc(PM8001_MAX_CCB, GFP_KERNEL);
if (!pm8001_ha->tags)
goto err_out;
/* MPI Memory region 1 for AAP Event Log for fw */
pm8001_ha->memoryMap.region[AAP1].num_elements = 1;
pm8001_ha->memoryMap.region[AAP1].element_size = PM8001_EVENT_LOG_SIZE;
Expand Down Expand Up @@ -287,6 +287,9 @@ static int __devinit pm8001_alloc(struct pm8001_hba_info *pm8001_ha)
pm8001_ha->ccb_info[i].ccb_dma_handle =
pm8001_ha->memoryMap.region[CCB_MEM].phys_addr +
i * sizeof(struct pm8001_ccb_info);
pm8001_ha->ccb_info[i].task = NULL;
pm8001_ha->ccb_info[i].ccb_tag = 0xffffffff;
pm8001_ha->ccb_info[i].device = NULL;
++pm8001_ha->tags_num;
}
pm8001_ha->flags = PM8001F_INIT_TIME;
Expand Down Expand Up @@ -578,7 +581,7 @@ static u32 pm8001_request_irq(struct pm8001_hba_info *pm8001_ha)
{
struct pci_dev *pdev;
irq_handler_t irq_handler = pm8001_interrupt;
u32 rc;
int rc;

pdev = pm8001_ha->pdev;

Expand Down
60 changes: 29 additions & 31 deletions drivers/scsi/pm8001/pm8001_sas.c
Original file line number Diff line number Diff line change
Expand Up @@ -330,15 +330,12 @@ int pm8001_slave_configure(struct scsi_device *sdev)
return 0;
}
/**
* pm8001_task_exec -execute the task which come from upper level, send the
* command or data to DMA area and then increase CI,for queuecommand(ssp),
* it is from upper layer and for smp command,it is from libsas,
* for ata command it is from libata.
* pm8001_task_exec - queue the task(ssp, smp && ata) to the hardware.
* @task: the task to be execute.
* @num: if can_queue great than 1, the task can be queued up. for SMP task,
* we always execute one one time.
* @gfp_flags: gfp_flags.
* @is tmf: if it is task management task.
* @is_tmf: if it is task management task.
* @tmf: the task management IU
*/
#define DEV_IS_GONE(pm8001_dev) \
Expand Down Expand Up @@ -379,7 +376,7 @@ static int pm8001_task_exec(struct sas_task *task, const int num,
pm8001_printk("device %016llx not "
"ready.\n", SAS_ADDR(dev->sas_addr)));
}
rc = SAS_PHY_DOWN;
rc = SAS_PHY_DOWN;
goto out_done;
}
rc = pm8001_tag_alloc(pm8001_ha, &tag);
Expand All @@ -395,14 +392,14 @@ static int pm8001_task_exec(struct sas_task *task, const int num,
t->data_dir);
if (!n_elem) {
rc = -ENOMEM;
goto err_out;
goto err_out_tag;
}
}
} else {
n_elem = t->num_scatter;
}

t->lldd_task = NULL;
t->lldd_task = ccb;
ccb->n_elem = n_elem;
ccb->ccb_tag = tag;
ccb->task = t;
Expand Down Expand Up @@ -435,7 +432,6 @@ static int pm8001_task_exec(struct sas_task *task, const int num,
pm8001_printk("rc is %x\n", rc));
goto err_out_tag;
}
t->lldd_task = ccb;
/* TODO: select normal or high priority */
spin_lock(&t->task_state_lock);
t->task_state_flags |= SAS_TASK_AT_INITIATOR;
Expand Down Expand Up @@ -518,8 +514,7 @@ void pm8001_ccb_task_free(struct pm8001_hba_info *pm8001_ha,
}

/**
* pm8001_alloc_dev - find the empty pm8001_device structure, allocate and
* return it for use.
* pm8001_alloc_dev - find a empty pm8001_device
* @pm8001_ha: our hba card information
*/
struct pm8001_device *pm8001_alloc_dev(struct pm8001_hba_info *pm8001_ha)
Expand Down Expand Up @@ -550,14 +545,16 @@ static void pm8001_free_dev(struct pm8001_device *pm8001_dev)
}

/**
* pm8001_dev_found_notify - when libsas find a sas domain device, it should
* tell the LLDD that device is found, and then LLDD register this device to
* HBA FW by the command "OPC_INB_REG_DEV", after that the HBA will assign
* a device ID(according to device's sas address) and returned it to LLDD.from
* pm8001_dev_found_notify - libsas notify a device is found.
* @dev: the device structure which sas layer used.
*
* when libsas find a sas domain device, it should tell the LLDD that
* device is found, and then LLDD register this device to HBA firmware
* by the command "OPC_INB_REG_DEV", after that the HBA will assign a
* device ID(according to device's sas address) and returned it to LLDD. From
* now on, we communicate with HBA FW with the device ID which HBA assigned
* rather than sas address. it is the neccessary step for our HBA but it is
* the optional for other HBA driver.
* @dev: the device structure which sas layer used.
*/
static int pm8001_dev_found_notify(struct domain_device *dev)
{
Expand Down Expand Up @@ -665,14 +662,15 @@ static void pm8001_tmf_timedout(unsigned long data)

#define PM8001_TASK_TIMEOUT 20
/**
* pm8001_exec_internal_tmf_task - when errors or exception happened, we may
* want to do something, for example abort issued task which result in this
* execption, this is by calling this function, note it is also with the task
* execute interface.
* pm8001_exec_internal_tmf_task - execute some task management commands.
* @dev: the wanted device.
* @tmf: which task management wanted to be take.
* @para_len: para_len.
* @parameter: ssp task parameter.
*
* when errors or exception happened, we may want to do something, for example
* abort the issued task which result in this execption, it is done by calling
* this function, note it is also with the task execute interface.
*/
static int pm8001_exec_internal_tmf_task(struct domain_device *dev,
void *parameter, u32 para_len, struct pm8001_tmf_task *tmf)
Expand Down Expand Up @@ -737,9 +735,9 @@ static int pm8001_exec_internal_tmf_task(struct domain_device *dev,
res = -EMSGSIZE;
break;
} else {
PM8001_IO_DBG(pm8001_ha,
pm8001_printk(" Task to dev %016llx response: 0x%x"
"status 0x%x\n",
PM8001_EH_DBG(pm8001_ha,
pm8001_printk(" Task to dev %016llx response:"
"0x%x status 0x%x\n",
SAS_ADDR(dev->sas_addr),
task->task_status.resp,
task->task_status.stat));
Expand All @@ -760,7 +758,7 @@ pm8001_exec_internal_task_abort(struct pm8001_hba_info *pm8001_ha,
u32 task_tag)
{
int res, retry;
u32 rc, ccb_tag;
u32 ccb_tag;
struct pm8001_ccb_info *ccb;
struct sas_task *task = NULL;

Expand All @@ -777,9 +775,9 @@ pm8001_exec_internal_task_abort(struct pm8001_hba_info *pm8001_ha,
task->timer.expires = jiffies + PM8001_TASK_TIMEOUT*HZ;
add_timer(&task->timer);

rc = pm8001_tag_alloc(pm8001_ha, &ccb_tag);
if (rc)
return rc;
res = pm8001_tag_alloc(pm8001_ha, &ccb_tag);
if (res)
return res;
ccb = &pm8001_ha->ccb_info[ccb_tag];
ccb->device = pm8001_dev;
ccb->ccb_tag = ccb_tag;
Expand Down Expand Up @@ -812,7 +810,7 @@ pm8001_exec_internal_task_abort(struct pm8001_hba_info *pm8001_ha,
break;

} else {
PM8001_IO_DBG(pm8001_ha,
PM8001_EH_DBG(pm8001_ha,
pm8001_printk(" Task to dev %016llx response: "
"0x%x status 0x%x\n",
SAS_ADDR(dev->sas_addr),
Expand Down Expand Up @@ -1027,11 +1025,11 @@ int pm8001_abort_task(struct sas_task *task)
}
device_id = pm8001_dev->device_id;
PM8001_EH_DBG(pm8001_ha,
pm8001_printk("abort io to device_id = %d\n", device_id));
tmf_task.tmf = TMF_ABORT_TASK;
pm8001_printk("abort io to deviceid= %d\n", device_id));
tmf_task.tmf = TMF_ABORT_TASK;
tmf_task.tag_of_task_to_be_managed = tag;
rc = pm8001_issue_ssp_tmf(dev, lun.scsi_lun, &tmf_task);
rc = pm8001_exec_internal_task_abort(pm8001_ha, pm8001_dev,
pm8001_exec_internal_task_abort(pm8001_ha, pm8001_dev,
pm8001_dev->sas_device, 0, tag);
} else if (task->task_proto & SAS_PROTOCOL_SATA ||
task->task_proto & SAS_PROTOCOL_STP) {
Expand Down

0 comments on commit 97ee208

Please sign in to comment.