Re: [PATCH 2/3] ipr: include the resource path in the IOA status area structure

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Acked-by: Brian King <brking@xxxxxxxxxxxxxxxxxx>

On 05/10/2010 11:13 AM, Wayne Boyer wrote:
> The IOA status area now includes the new resource path field for 64 bit
> adapters.  This patch changes the driver to fix the ioasa structure and to use
> the correct structure definition based on the type of adatper.
> 
> Signed-off-by: Wayne Boyer <wayneb@xxxxxxxxxxxxxxxxxx>
> ---
> 
>  drivers/scsi/ipr.c |  131 +++++++++++++++++++++++++++++------------------------
>  drivers/scsi/ipr.h |   26 +++++++++-
>  2 files changed, 98 insertions(+), 59 deletions(-)
> 
> Index: b/drivers/scsi/ipr.c
> ===================================================================
> --- a/drivers/scsi/ipr.c	2010-05-07 09:03:49.000000000 -0700
> +++ b/drivers/scsi/ipr.c	2010-05-07 09:36:21.000000000 -0700
> @@ -567,7 +567,8 @@ static void ipr_trc_hook(struct ipr_cmnd
>  static void ipr_reinit_ipr_cmnd(struct ipr_cmnd *ipr_cmd)
>  {
>  	struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
> -	struct ipr_ioasa *ioasa = &ipr_cmd->ioasa;
> +	struct ipr_ioasa *ioasa = &ipr_cmd->s.ioasa;
> +	struct ipr_ioasa64 *ioasa64 = &ipr_cmd->s.ioasa64;
>  	dma_addr_t dma_addr = ipr_cmd->dma_addr;
> 
>  	memset(&ioarcb->cmd_pkt, 0, sizeof(struct ipr_cmd_pkt));
> @@ -576,19 +577,19 @@ static void ipr_reinit_ipr_cmnd(struct i
>  	ioarcb->ioadl_len = 0;
>  	ioarcb->read_ioadl_len = 0;
> 
> -	if (ipr_cmd->ioa_cfg->sis64)
> +	if (ipr_cmd->ioa_cfg->sis64) {
>  		ioarcb->u.sis64_addr_data.data_ioadl_addr =
>  			cpu_to_be64(dma_addr + offsetof(struct ipr_cmnd, i.ioadl64));
> -	else {
> +		ioasa64->u.gata.status = 0;
> +	} else {
>  		ioarcb->write_ioadl_addr =
>  			cpu_to_be32(dma_addr + offsetof(struct ipr_cmnd, i.ioadl));
>  		ioarcb->read_ioadl_addr = ioarcb->write_ioadl_addr;
> +		ioasa->u.gata.status = 0;
>  	}
> 
> -	ioasa->ioasc = 0;
> -	ioasa->residual_data_len = 0;
> -	ioasa->u.gata.status = 0;
> -
> +	ioasa->hdr.ioasc = 0;
> +	ioasa->hdr.residual_data_len = 0;
>  	ipr_cmd->scsi_cmd = NULL;
>  	ipr_cmd->qc = NULL;
>  	ipr_cmd->sense_buffer[0] = 0;
> @@ -768,8 +769,8 @@ static void ipr_fail_all_ops(struct ipr_
>  	list_for_each_entry_safe(ipr_cmd, temp, &ioa_cfg->pending_q, queue) {
>  		list_del(&ipr_cmd->queue);
> 
> -		ipr_cmd->ioasa.ioasc = cpu_to_be32(IPR_IOASC_IOA_WAS_RESET);
> -		ipr_cmd->ioasa.ilid = cpu_to_be32(IPR_DRIVER_ILID);
> +		ipr_cmd->s.ioasa.hdr.ioasc = cpu_to_be32(IPR_IOASC_IOA_WAS_RESET);
> +		ipr_cmd->s.ioasa.hdr.ilid = cpu_to_be32(IPR_DRIVER_ILID);
> 
>  		if (ipr_cmd->scsi_cmd)
>  			ipr_cmd->done = ipr_scsi_eh_done;
> @@ -1319,7 +1320,7 @@ static void ipr_process_ccn(struct ipr_c
>  {
>  	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
>  	struct ipr_hostrcb *hostrcb = ipr_cmd->u.hostrcb;
> -	u32 ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
> +	u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
> 
>  	list_del(&hostrcb->queue);
>  	list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q);
> @@ -2354,7 +2355,7 @@ static void ipr_process_error(struct ipr
>  {
>  	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
>  	struct ipr_hostrcb *hostrcb = ipr_cmd->u.hostrcb;
> -	u32 ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
> +	u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
>  	u32 fd_ioasc;
> 
>  	if (ioa_cfg->sis64)
> @@ -4506,11 +4507,16 @@ static int ipr_device_reset(struct ipr_i
>  	}
> 
>  	ipr_send_blocking_cmd(ipr_cmd, ipr_timeout, IPR_DEVICE_RESET_TIMEOUT);
> -	ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
> +	ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
>  	list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q);
> -	if (ipr_is_gata(res) && res->sata_port && ioasc != IPR_IOASC_IOA_WAS_RESET)
> -		memcpy(&res->sata_port->ioasa, &ipr_cmd->ioasa.u.gata,
> -		       sizeof(struct ipr_ioasa_gata));
> +	if (ipr_is_gata(res) && res->sata_port && ioasc != IPR_IOASC_IOA_WAS_RESET) {
> +		if (ipr_cmd->ioa_cfg->sis64)
> +			memcpy(&res->sata_port->ioasa, &ipr_cmd->s.ioasa64.u.gata,
> +			       sizeof(struct ipr_ioasa_gata));
> +		else
> +			memcpy(&res->sata_port->ioasa, &ipr_cmd->s.ioasa.u.gata,
> +			       sizeof(struct ipr_ioasa_gata));
> +	}
> 
>  	LEAVE;
>  	return (IPR_IOASC_SENSE_KEY(ioasc) ? -EIO : 0);
> @@ -4765,7 +4771,7 @@ static int ipr_cancel_op(struct scsi_cmn
>  	scmd_printk(KERN_ERR, scsi_cmd, "Aborting command: %02X\n",
>  		    scsi_cmd->cmnd[0]);
>  	ipr_send_blocking_cmd(ipr_cmd, ipr_abort_timeout, IPR_CANCEL_ALL_TIMEOUT);
> -	ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
> +	ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
> 
>  	/*
>  	 * If the abort task timed out and we sent a bus reset, we will get
> @@ -4937,7 +4943,7 @@ static irqreturn_t ipr_isr(int irq, void
> 
>  			ipr_cmd = ioa_cfg->ipr_cmnd_list[cmd_index];
> 
> -			ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
> +			ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
> 
>  			ipr_trc_hook(ipr_cmd, IPR_TRACE_FINISH, ioasc);
> 
> @@ -5134,7 +5140,7 @@ static void ipr_erp_done(struct ipr_cmnd
>  	struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd;
>  	struct ipr_resource_entry *res = scsi_cmd->device->hostdata;
>  	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
> -	u32 ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
> +	u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
> 
>  	if (IPR_IOASC_SENSE_KEY(ioasc) > 0) {
>  		scsi_cmd->result |= (DID_ERROR << 16);
> @@ -5165,7 +5171,7 @@ static void ipr_erp_done(struct ipr_cmnd
>  static void ipr_reinit_ipr_cmnd_for_erp(struct ipr_cmnd *ipr_cmd)
>  {
>  	struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
> -	struct ipr_ioasa *ioasa = &ipr_cmd->ioasa;
> +	struct ipr_ioasa *ioasa = &ipr_cmd->s.ioasa;
>  	dma_addr_t dma_addr = ipr_cmd->dma_addr;
> 
>  	memset(&ioarcb->cmd_pkt, 0, sizeof(struct ipr_cmd_pkt));
> @@ -5173,8 +5179,8 @@ static void ipr_reinit_ipr_cmnd_for_erp(
>  	ioarcb->read_data_transfer_length = 0;
>  	ioarcb->ioadl_len = 0;
>  	ioarcb->read_ioadl_len = 0;
> -	ioasa->ioasc = 0;
> -	ioasa->residual_data_len = 0;
> +	ioasa->hdr.ioasc = 0;
> +	ioasa->hdr.residual_data_len = 0;
> 
>  	if (ipr_cmd->ioa_cfg->sis64)
>  		ioarcb->u.sis64_addr_data.data_ioadl_addr =
> @@ -5199,7 +5205,7 @@ static void ipr_reinit_ipr_cmnd_for_erp(
>  static void ipr_erp_request_sense(struct ipr_cmnd *ipr_cmd)
>  {
>  	struct ipr_cmd_pkt *cmd_pkt = &ipr_cmd->ioarcb.cmd_pkt;
> -	u32 ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
> +	u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
> 
>  	if (IPR_IOASC_SENSE_KEY(ioasc) > 0) {
>  		ipr_erp_done(ipr_cmd);
> @@ -5276,12 +5282,12 @@ static void ipr_dump_ioasa(struct ipr_io
>  	int i;
>  	u16 data_len;
>  	u32 ioasc, fd_ioasc;
> -	struct ipr_ioasa *ioasa = &ipr_cmd->ioasa;
> +	struct ipr_ioasa *ioasa = &ipr_cmd->s.ioasa;
>  	__be32 *ioasa_data = (__be32 *)ioasa;
>  	int error_index;
> 
> -	ioasc = be32_to_cpu(ioasa->ioasc) & IPR_IOASC_IOASC_MASK;
> -	fd_ioasc = be32_to_cpu(ioasa->fd_ioasc) & IPR_IOASC_IOASC_MASK;
> +	ioasc = be32_to_cpu(ioasa->hdr.ioasc) & IPR_IOASC_IOASC_MASK;
> +	fd_ioasc = be32_to_cpu(ioasa->hdr.fd_ioasc) & IPR_IOASC_IOASC_MASK;
> 
>  	if (0 == ioasc)
>  		return;
> @@ -5296,7 +5302,7 @@ static void ipr_dump_ioasa(struct ipr_io
> 
>  	if (ioa_cfg->log_level < IPR_MAX_LOG_LEVEL) {
>  		/* Don't log an error if the IOA already logged one */
> -		if (ioasa->ilid != 0)
> +		if (ioasa->hdr.ilid != 0)
>  			return;
> 
>  		if (!ipr_is_gscsi(res))
> @@ -5308,10 +5314,11 @@ static void ipr_dump_ioasa(struct ipr_io
> 
>  	ipr_res_err(ioa_cfg, res, "%s\n", ipr_error_table[error_index].error);
> 
> -	if (sizeof(struct ipr_ioasa) < be16_to_cpu(ioasa->ret_stat_len))
> +	data_len = be16_to_cpu(ioasa->hdr.ret_stat_len);
> +	if (ioa_cfg->sis64 && sizeof(struct ipr_ioasa64) < data_len)
> +		data_len = sizeof(struct ipr_ioasa64);
> +	else if (!ioa_cfg->sis64 && sizeof(struct ipr_ioasa) < data_len)
>  		data_len = sizeof(struct ipr_ioasa);
> -	else
> -		data_len = be16_to_cpu(ioasa->ret_stat_len);
> 
>  	ipr_err("IOASA Dump:\n");
> 
> @@ -5337,8 +5344,8 @@ static void ipr_gen_sense(struct ipr_cmn
>  	u32 failing_lba;
>  	u8 *sense_buf = ipr_cmd->scsi_cmd->sense_buffer;
>  	struct ipr_resource_entry *res = ipr_cmd->scsi_cmd->device->hostdata;
> -	struct ipr_ioasa *ioasa = &ipr_cmd->ioasa;
> -	u32 ioasc = be32_to_cpu(ioasa->ioasc);
> +	struct ipr_ioasa *ioasa = &ipr_cmd->s.ioasa;
> +	u32 ioasc = be32_to_cpu(ioasa->hdr.ioasc);
> 
>  	memset(sense_buf, 0, SCSI_SENSE_BUFFERSIZE);
> 
> @@ -5381,7 +5388,7 @@ static void ipr_gen_sense(struct ipr_cmn
> 
>  		/* Illegal request */
>  		if ((IPR_IOASC_SENSE_KEY(ioasc) == 0x05) &&
> -		    (be32_to_cpu(ioasa->ioasc_specific) & IPR_FIELD_POINTER_VALID)) {
> +		    (be32_to_cpu(ioasa->hdr.ioasc_specific) & IPR_FIELD_POINTER_VALID)) {
>  			sense_buf[7] = 10;	/* additional length */
> 
>  			/* IOARCB was in error */
> @@ -5392,10 +5399,10 @@ static void ipr_gen_sense(struct ipr_cmn
> 
>  			sense_buf[16] =
>  			    ((IPR_FIELD_POINTER_MASK &
> -			      be32_to_cpu(ioasa->ioasc_specific)) >> 8) & 0xff;
> +			      be32_to_cpu(ioasa->hdr.ioasc_specific)) >> 8) & 0xff;
>  			sense_buf[17] =
>  			    (IPR_FIELD_POINTER_MASK &
> -			     be32_to_cpu(ioasa->ioasc_specific)) & 0xff;
> +			     be32_to_cpu(ioasa->hdr.ioasc_specific)) & 0xff;
>  		} else {
>  			if (ioasc == IPR_IOASC_MED_DO_NOT_REALLOC) {
>  				if (ipr_is_vset_device(res))
> @@ -5427,14 +5434,20 @@ static void ipr_gen_sense(struct ipr_cmn
>   **/
>  static int ipr_get_autosense(struct ipr_cmnd *ipr_cmd)
>  {
> -	struct ipr_ioasa *ioasa = &ipr_cmd->ioasa;
> +	struct ipr_ioasa *ioasa = &ipr_cmd->s.ioasa;
> +	struct ipr_ioasa64 *ioasa64 = &ipr_cmd->s.ioasa64;
> 
> -	if ((be32_to_cpu(ioasa->ioasc_specific) & IPR_AUTOSENSE_VALID) == 0)
> +	if ((be32_to_cpu(ioasa->hdr.ioasc_specific) & IPR_AUTOSENSE_VALID) == 0)
>  		return 0;
> 
> -	memcpy(ipr_cmd->scsi_cmd->sense_buffer, ioasa->auto_sense.data,
> -	       min_t(u16, be16_to_cpu(ioasa->auto_sense.auto_sense_len),
> -		   SCSI_SENSE_BUFFERSIZE));
> +	if (ipr_cmd->ioa_cfg->sis64)
> +		memcpy(ipr_cmd->scsi_cmd->sense_buffer, ioasa64->auto_sense.data,
> +		       min_t(u16, be16_to_cpu(ioasa64->auto_sense.auto_sense_len),
> +			   SCSI_SENSE_BUFFERSIZE));
> +	else
> +		memcpy(ipr_cmd->scsi_cmd->sense_buffer, ioasa->auto_sense.data,
> +		       min_t(u16, be16_to_cpu(ioasa->auto_sense.auto_sense_len),
> +			   SCSI_SENSE_BUFFERSIZE));
>  	return 1;
>  }
> 
> @@ -5454,7 +5467,7 @@ static void ipr_erp_start(struct ipr_ioa
>  {
>  	struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd;
>  	struct ipr_resource_entry *res = scsi_cmd->device->hostdata;
> -	u32 ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
> +	u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
>  	u32 masked_ioasc = ioasc & IPR_IOASC_IOASC_MASK;
> 
>  	if (!res) {
> @@ -5546,9 +5559,9 @@ static void ipr_scsi_done(struct ipr_cmn
>  {
>  	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
>  	struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd;
> -	u32 ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
> +	u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
> 
> -	scsi_set_resid(scsi_cmd, be32_to_cpu(ipr_cmd->ioasa.residual_data_len));
> +	scsi_set_resid(scsi_cmd, be32_to_cpu(ipr_cmd->s.ioasa.hdr.residual_data_len));
> 
>  	if (likely(IPR_IOASC_SENSE_KEY(ioasc) == 0)) {
>  		scsi_dma_unmap(ipr_cmd->scsi_cmd);
> @@ -5838,19 +5851,23 @@ static void ipr_sata_done(struct ipr_cmn
>  	struct ata_queued_cmd *qc = ipr_cmd->qc;
>  	struct ipr_sata_port *sata_port = qc->ap->private_data;
>  	struct ipr_resource_entry *res = sata_port->res;
> -	u32 ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
> +	u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
> 
> -	memcpy(&sata_port->ioasa, &ipr_cmd->ioasa.u.gata,
> -	       sizeof(struct ipr_ioasa_gata));
> +	if (ipr_cmd->ioa_cfg->sis64)
> +		memcpy(&sata_port->ioasa, &ipr_cmd->s.ioasa64.u.gata,
> +		       sizeof(struct ipr_ioasa_gata));
> +	else
> +		memcpy(&sata_port->ioasa, &ipr_cmd->s.ioasa.u.gata,
> +		       sizeof(struct ipr_ioasa_gata));
>  	ipr_dump_ioasa(ioa_cfg, ipr_cmd, res);
> 
> -	if (be32_to_cpu(ipr_cmd->ioasa.ioasc_specific) & IPR_ATA_DEVICE_WAS_RESET)
> +	if (be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc_specific) & IPR_ATA_DEVICE_WAS_RESET)
>  		scsi_report_device_reset(ioa_cfg->host, res->bus, res->target);
> 
>  	if (IPR_IOASC_SENSE_KEY(ioasc) > RECOVERED_ERROR)
> -		qc->err_mask |= __ac_err_mask(ipr_cmd->ioasa.u.gata.status);
> +		qc->err_mask |= __ac_err_mask(sata_port->ioasa.status);
>  	else
> -		qc->err_mask |= ac_err_mask(ipr_cmd->ioasa.u.gata.status);
> +		qc->err_mask |= ac_err_mask(sata_port->ioasa.status);
>  	list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q);
>  	ata_qc_complete(qc);
>  }
> @@ -6519,7 +6536,7 @@ static void ipr_build_mode_sense(struct 
>  static int ipr_reset_cmd_failed(struct ipr_cmnd *ipr_cmd)
>  {
>  	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
> -	u32 ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
> +	u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
> 
>  	dev_err(&ioa_cfg->pdev->dev,
>  		"0x%02X failed with IOASC: 0x%08X\n",
> @@ -6543,7 +6560,7 @@ static int ipr_reset_cmd_failed(struct i
>  static int ipr_reset_mode_sense_failed(struct ipr_cmnd *ipr_cmd)
>  {
>  	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
> -	u32 ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
> +	u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
> 
>  	if (ioasc == IPR_IOASC_IR_INVALID_REQ_TYPE_OR_PKT) {
>  		ipr_cmd->job_step = ipr_set_supported_devs;
> @@ -6633,7 +6650,7 @@ static int ipr_ioafp_mode_select_page24(
>   **/
>  static int ipr_reset_mode_sense_page24_failed(struct ipr_cmnd *ipr_cmd)
>  {
> -	u32 ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
> +	u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
> 
>  	if (ioasc == IPR_IOASC_IR_INVALID_REQ_TYPE_OR_PKT) {
>  		ipr_cmd->job_step = ipr_ioafp_mode_sense_page28;
> @@ -7334,12 +7351,12 @@ static int ipr_reset_restore_cfg_space(s
>  	rc = pci_restore_state(ioa_cfg->pdev);
> 
>  	if (rc != PCIBIOS_SUCCESSFUL) {
> -		ipr_cmd->ioasa.ioasc = cpu_to_be32(IPR_IOASC_PCI_ACCESS_ERROR);
> +		ipr_cmd->s.ioasa.hdr.ioasc = cpu_to_be32(IPR_IOASC_PCI_ACCESS_ERROR);
>  		return IPR_RC_JOB_CONTINUE;
>  	}
> 
>  	if (ipr_set_pcix_cmd_reg(ioa_cfg)) {
> -		ipr_cmd->ioasa.ioasc = cpu_to_be32(IPR_IOASC_PCI_ACCESS_ERROR);
> +		ipr_cmd->s.ioasa.hdr.ioasc = cpu_to_be32(IPR_IOASC_PCI_ACCESS_ERROR);
>  		return IPR_RC_JOB_CONTINUE;
>  	}
> 
> @@ -7408,7 +7425,7 @@ static int ipr_reset_start_bist(struct i
> 
>  	if (rc != PCIBIOS_SUCCESSFUL) {
>  		pci_unblock_user_cfg_access(ipr_cmd->ioa_cfg->pdev);
> -		ipr_cmd->ioasa.ioasc = cpu_to_be32(IPR_IOASC_PCI_ACCESS_ERROR);
> +		ipr_cmd->s.ioasa.hdr.ioasc = cpu_to_be32(IPR_IOASC_PCI_ACCESS_ERROR);
>  		rc = IPR_RC_JOB_CONTINUE;
>  	} else {
>  		ipr_cmd->job_step = ipr_reset_bist_done;
> @@ -7667,7 +7684,7 @@ static void ipr_reset_ioa_job(struct ipr
>  	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
> 
>  	do {
> -		ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
> +		ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
> 
>  		if (ioa_cfg->reset_cmd != ipr_cmd) {
>  			/*
> @@ -8050,13 +8067,13 @@ static int __devinit ipr_alloc_cmd_blks(
>  			ioarcb->u.sis64_addr_data.data_ioadl_addr =
>  				cpu_to_be64(dma_addr + offsetof(struct ipr_cmnd, i.ioadl64));
>  			ioarcb->u.sis64_addr_data.ioasa_host_pci_addr =
> -				cpu_to_be64(dma_addr + offsetof(struct ipr_cmnd, ioasa));
> +				cpu_to_be64(dma_addr + offsetof(struct ipr_cmnd, s.ioasa64));
>  		} else {
>  			ioarcb->write_ioadl_addr =
>  				cpu_to_be32(dma_addr + offsetof(struct ipr_cmnd, i.ioadl));
>  			ioarcb->read_ioadl_addr = ioarcb->write_ioadl_addr;
>  			ioarcb->ioasa_host_pci_addr =
> -				cpu_to_be32(dma_addr + offsetof(struct ipr_cmnd, ioasa));
> +				cpu_to_be32(dma_addr + offsetof(struct ipr_cmnd, s.ioasa));
>  		}
>  		ioarcb->ioasa_len = cpu_to_be16(sizeof(struct ipr_ioasa));
>  		ipr_cmd->cmd_index = i;
> Index: b/drivers/scsi/ipr.h
> ===================================================================
> --- a/drivers/scsi/ipr.h	2010-05-07 09:03:49.000000000 -0700
> +++ b/drivers/scsi/ipr.h	2010-05-07 09:36:21.000000000 -0700
> @@ -614,7 +614,7 @@ struct ipr_auto_sense {
>  	__be32 data[SCSI_SENSE_BUFFERSIZE/sizeof(__be32)];
>  };
> 
> -struct ipr_ioasa {
> +struct ipr_ioasa_hdr {
>  	__be32 ioasc;
>  #define IPR_IOASC_SENSE_KEY(ioasc) ((ioasc) >> 24)
>  #define IPR_IOASC_SENSE_CODE(ioasc) (((ioasc) & 0x00ff0000) >> 16)
> @@ -646,6 +646,25 @@ struct ipr_ioasa {
>  #define IPR_FIELD_POINTER_VALID		(0x80000000 >> 8)
>  #define IPR_FIELD_POINTER_MASK		0x0000ffff
> 
> +}__attribute__((packed, aligned (4)));
> +
> +struct ipr_ioasa {
> +	struct ipr_ioasa_hdr hdr;
> +
> +	union {
> +		struct ipr_ioasa_vset vset;
> +		struct ipr_ioasa_af_dasd dasd;
> +		struct ipr_ioasa_gpdd gpdd;
> +		struct ipr_ioasa_gata gata;
> +	} u;
> +
> +	struct ipr_auto_sense auto_sense;
> +}__attribute__((packed, aligned (4)));
> +
> +struct ipr_ioasa64 {
> +	struct ipr_ioasa_hdr hdr;
> +	u8 fd_res_path[8];
> +
>  	union {
>  		struct ipr_ioasa_vset vset;
>  		struct ipr_ioasa_af_dasd dasd;
> @@ -1465,7 +1484,10 @@ struct ipr_cmnd {
>  		struct ipr_ioadl64_desc ioadl64[IPR_NUM_IOADL_ENTRIES];
>  		struct ipr_ata64_ioadl ata_ioadl;
>  	} i;
> -	struct ipr_ioasa ioasa;
> +	union {
> +		struct ipr_ioasa ioasa;
> +		struct ipr_ioasa64 ioasa64;
> +	} s;
>  	struct list_head queue;
>  	struct scsi_cmnd *scsi_cmd;
>  	struct ata_queued_cmd *qc;
> 


-- 
Brian King
Linux on Power Virtualization
IBM Linux Technology Center
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux