1366ca51f30de1cbb5b356c70b7bb22051c558e41James Bottomley#include <linux/kernel.h> 209703660edf83b8b6d175440bf745f30580d85abPaul Gortmaker#include <linux/export.h> 3366ca51f30de1cbb5b356c70b7bb22051c558e41James Bottomley#include <scsi/sas.h> 4366ca51f30de1cbb5b356c70b7bb22051c558e41James Bottomley#include <scsi/libsas.h> 5366ca51f30de1cbb5b356c70b7bb22051c558e41James Bottomley 6366ca51f30de1cbb5b356c70b7bb22051c558e41James Bottomley/* fill task_status_struct based on SSP response frame */ 7366ca51f30de1cbb5b356c70b7bb22051c558e41James Bottomleyvoid sas_ssp_task_response(struct device *dev, struct sas_task *task, 8366ca51f30de1cbb5b356c70b7bb22051c558e41James Bottomley struct ssp_response_iu *iu) 9366ca51f30de1cbb5b356c70b7bb22051c558e41James Bottomley{ 10366ca51f30de1cbb5b356c70b7bb22051c558e41James Bottomley struct task_status_struct *tstat = &task->task_status; 11366ca51f30de1cbb5b356c70b7bb22051c558e41James Bottomley 12366ca51f30de1cbb5b356c70b7bb22051c558e41James Bottomley tstat->resp = SAS_TASK_COMPLETE; 13366ca51f30de1cbb5b356c70b7bb22051c558e41James Bottomley 14366ca51f30de1cbb5b356c70b7bb22051c558e41James Bottomley if (iu->datapres == 0) 15366ca51f30de1cbb5b356c70b7bb22051c558e41James Bottomley tstat->stat = iu->status; 16366ca51f30de1cbb5b356c70b7bb22051c558e41James Bottomley else if (iu->datapres == 1) 17366ca51f30de1cbb5b356c70b7bb22051c558e41James Bottomley tstat->stat = iu->resp_data[3]; 18366ca51f30de1cbb5b356c70b7bb22051c558e41James Bottomley else if (iu->datapres == 2) { 19df64d3caab8db6ae17dacd229a03d7689a10c432James Bottomley tstat->stat = SAM_STAT_CHECK_CONDITION; 20366ca51f30de1cbb5b356c70b7bb22051c558e41James Bottomley tstat->buf_valid_size = 21366ca51f30de1cbb5b356c70b7bb22051c558e41James Bottomley min_t(int, SAS_STATUS_BUF_SIZE, 22366ca51f30de1cbb5b356c70b7bb22051c558e41James Bottomley be32_to_cpu(iu->sense_data_len)); 23366ca51f30de1cbb5b356c70b7bb22051c558e41James Bottomley memcpy(tstat->buf, iu->sense_data, tstat->buf_valid_size); 24366ca51f30de1cbb5b356c70b7bb22051c558e41James Bottomley 25df64d3caab8db6ae17dacd229a03d7689a10c432James Bottomley if (iu->status != SAM_STAT_CHECK_CONDITION) 26366ca51f30de1cbb5b356c70b7bb22051c558e41James Bottomley dev_printk(KERN_WARNING, dev, 27366ca51f30de1cbb5b356c70b7bb22051c558e41James Bottomley "dev %llx sent sense data, but " 28366ca51f30de1cbb5b356c70b7bb22051c558e41James Bottomley "stat(%x) is not CHECK CONDITION\n", 29366ca51f30de1cbb5b356c70b7bb22051c558e41James Bottomley SAS_ADDR(task->dev->sas_addr), 30366ca51f30de1cbb5b356c70b7bb22051c558e41James Bottomley iu->status); 31366ca51f30de1cbb5b356c70b7bb22051c558e41James Bottomley } 32366ca51f30de1cbb5b356c70b7bb22051c558e41James Bottomley else 33366ca51f30de1cbb5b356c70b7bb22051c558e41James Bottomley /* when datapres contains corrupt/unknown value... */ 34df64d3caab8db6ae17dacd229a03d7689a10c432James Bottomley tstat->stat = SAM_STAT_CHECK_CONDITION; 35366ca51f30de1cbb5b356c70b7bb22051c558e41James Bottomley} 36366ca51f30de1cbb5b356c70b7bb22051c558e41James BottomleyEXPORT_SYMBOL_GPL(sas_ssp_task_response); 37366ca51f30de1cbb5b356c70b7bb22051c558e41James Bottomley 38