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/

Reply via email to