On Wed, 24 Aug 2005, Keith Owens wrote: > 2.6.13-rc7 + kdb on ia64. The qla2xxx drivers are getting unaligned > accesses at startup. > > qla2300 0000:01:02.0: Found an ISP2312, irq 66, iobase 0xc00000080f300000 > qla2300 0000:01:02.0: Configuring PCI space... > PCI: slot 0000:01:02.0 has incorrect PCI cache line size of 0 bytes, > correcting to 128 > qla2300 0000:01:02.0: Configure NVRAM parameters... > qla2300 0000:01:02.0: Verifying loaded RISC code... > qla2300 0000:01:02.0: Waiting for LIP to complete... > qla2300 0000:01:02.0: Cable is unplugged... > scsi1 : qla2xxx > kernel unaligned access to 0xe00000300667800c, ip=0xa0000001005cd0b1
Yes, I have a fix for this in my patch-queue. I'll attach it here for reference. I'll forward onto linux-scsi post 2.6.13. -- av --- On some platforms the hard-casting of the 8 byte node_name and port_name arrays to an u64 would cause unaligned-access warnings. Generalize the conversions with consistent shifting of WWN bytes. Signed-off-by: Andrew Vasquez <[EMAIL PROTECTED]> --- drivers/scsi/qla2xxx/qla_attr.c | 27 +++++++++++++++++---------- 1 files changed, 17 insertions(+), 10 deletions(-) 24e16c86578498fd71a3e33bebbd8be7323a03c6 diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c --- a/drivers/scsi/qla2xxx/qla_attr.c +++ b/drivers/scsi/qla2xxx/qla_attr.c @@ -345,6 +345,15 @@ struct class_device_attribute *qla2x00_h /* Host attributes. */ +static u64 +wwn_to_u64(uint8_t *wwn) +{ + return (u64)wwn[0] << 56 | (u64)wwn[1] << 48 | + (u64)wwn[2] << 40 | (u64)wwn[3] << 32 | + (u64)wwn[4] << 24 | (u64)wwn[5] << 16 | + (u64)wwn[6] << 8 | (u64)wwn[7]; +} + static void qla2x00_get_host_port_id(struct Scsi_Host *shost) { @@ -360,16 +369,16 @@ qla2x00_get_starget_node_name(struct scs struct Scsi_Host *host = dev_to_shost(starget->dev.parent); scsi_qla_host_t *ha = to_qla_host(host); fc_port_t *fcport; - uint64_t node_name = 0; + u64 node_name = 0; list_for_each_entry(fcport, &ha->fcports, list) { if (starget->id == fcport->os_target_id) { - node_name = *(uint64_t *)fcport->node_name; + node_name = wwn_to_u64(fcport->node_name); break; } } - fc_starget_node_name(starget) = be64_to_cpu(node_name); + fc_starget_node_name(starget) = node_name; } static void @@ -378,16 +387,16 @@ qla2x00_get_starget_port_name(struct scs struct Scsi_Host *host = dev_to_shost(starget->dev.parent); scsi_qla_host_t *ha = to_qla_host(host); fc_port_t *fcport; - uint64_t port_name = 0; + u64 port_name = 0; list_for_each_entry(fcport, &ha->fcports, list) { if (starget->id == fcport->os_target_id) { - port_name = *(uint64_t *)fcport->port_name; + port_name = wwn_to_u64(fcport->port_name); break; } } - fc_starget_port_name(starget) = be64_to_cpu(port_name); + fc_starget_port_name(starget) = port_name; } static void @@ -460,9 +469,7 @@ struct fc_function_template qla2xxx_tran void qla2x00_init_host_attr(scsi_qla_host_t *ha) { - fc_host_node_name(ha->host) = - be64_to_cpu(*(uint64_t *)ha->init_cb->node_name); - fc_host_port_name(ha->host) = - be64_to_cpu(*(uint64_t *)ha->init_cb->port_name); + fc_host_node_name(ha->host) = wwn_to_u64(ha->init_cb->node_name); + fc_host_port_name(ha->host) = wwn_to_u64(ha->init_cb->port_name); fc_host_supported_classes(ha->host) = FC_COS_CLASS3; } - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/