aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/qla4xxx
diff options
context:
space:
mode:
authorMike Christie <michaelc@cs.wisc.edu>2011-10-06 04:56:59 -0400
committerJames Bottomley <JBottomley@Parallels.com>2011-10-20 11:12:44 -0400
commit00c31889f7513e9ffa6b2b4de8ad6d7f59a61c80 (patch)
tree6ba665724a1aed89f962598c323af9be18ce5688 /drivers/scsi/qla4xxx
parent88f4f5170fe74ae28443f304fcd226ddcf84f592 (diff)
[SCSI] qla4xxx: fix data alignment and use nl helpers
This has the driver use helpers for a common operation and fixes a issue where if multiple iscsi params are sent they could be sent at offsets that cause unaligned accesses. The nla helpers account for the padding needed to align properly for the driver. Signed-off-by: Mike Christie <michaelc@cs.wisc.edu> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi/qla4xxx')
-rw-r--r--drivers/scsi/qla4xxx/ql4_os.c21
1 files changed, 7 insertions, 14 deletions
diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c
index d39205c816d8..ce20dab75369 100644
--- a/drivers/scsi/qla4xxx/ql4_os.c
+++ b/drivers/scsi/qla4xxx/ql4_os.c
@@ -78,8 +78,8 @@ static int qla4xxx_conn_get_param(struct iscsi_cls_conn *conn,
78 enum iscsi_param param, char *buf); 78 enum iscsi_param param, char *buf);
79static int qla4xxx_host_get_param(struct Scsi_Host *shost, 79static int qla4xxx_host_get_param(struct Scsi_Host *shost,
80 enum iscsi_host_param param, char *buf); 80 enum iscsi_host_param param, char *buf);
81static int qla4xxx_iface_set_param(struct Scsi_Host *shost, char *data, 81static int qla4xxx_iface_set_param(struct Scsi_Host *shost, void *data,
82 int count); 82 uint32_t len);
83static int qla4xxx_get_iface_param(struct iscsi_iface *iface, 83static int qla4xxx_get_iface_param(struct iscsi_iface *iface,
84 enum iscsi_param_type param_type, 84 enum iscsi_param_type param_type,
85 int param, char *buf); 85 int param, char *buf);
@@ -842,7 +842,7 @@ qla4xxx_initcb_to_acb(struct addr_ctrl_blk *init_fw_cb)
842} 842}
843 843
844static int 844static int
845qla4xxx_iface_set_param(struct Scsi_Host *shost, char *data, int count) 845qla4xxx_iface_set_param(struct Scsi_Host *shost, void *data, uint32_t len)
846{ 846{
847 struct scsi_qla_host *ha = to_qla_host(shost); 847 struct scsi_qla_host *ha = to_qla_host(shost);
848 int rval = 0; 848 int rval = 0;
@@ -851,8 +851,8 @@ qla4xxx_iface_set_param(struct Scsi_Host *shost, char *data, int count)
851 dma_addr_t init_fw_cb_dma; 851 dma_addr_t init_fw_cb_dma;
852 uint32_t mbox_cmd[MBOX_REG_COUNT]; 852 uint32_t mbox_cmd[MBOX_REG_COUNT];
853 uint32_t mbox_sts[MBOX_REG_COUNT]; 853 uint32_t mbox_sts[MBOX_REG_COUNT];
854 uint32_t total_param_count; 854 uint32_t rem = len;
855 uint32_t length; 855 struct nlattr *attr;
856 856
857 init_fw_cb = dma_alloc_coherent(&ha->pdev->dev, 857 init_fw_cb = dma_alloc_coherent(&ha->pdev->dev,
858 sizeof(struct addr_ctrl_blk), 858 sizeof(struct addr_ctrl_blk),
@@ -873,11 +873,8 @@ qla4xxx_iface_set_param(struct Scsi_Host *shost, char *data, int count)
873 goto exit_init_fw_cb; 873 goto exit_init_fw_cb;
874 } 874 }
875 875
876 total_param_count = count; 876 nla_for_each_attr(attr, data, len, rem) {
877 iface_param = (struct iscsi_iface_param_info *)data; 877 iface_param = nla_data(attr);
878
879 for ( ; total_param_count != 0; total_param_count--) {
880 length = iface_param->len;
881 878
882 if (iface_param->param_type != ISCSI_NET_PARAM) 879 if (iface_param->param_type != ISCSI_NET_PARAM)
883 continue; 880 continue;
@@ -914,10 +911,6 @@ qla4xxx_iface_set_param(struct Scsi_Host *shost, char *data, int count)
914 ql4_printk(KERN_ERR, ha, "Invalid iface type\n"); 911 ql4_printk(KERN_ERR, ha, "Invalid iface type\n");
915 break; 912 break;
916 } 913 }
917
918 iface_param = (struct iscsi_iface_param_info *)
919 ((uint8_t *)iface_param +
920 sizeof(struct iscsi_iface_param_info) + length);
921 } 914 }
922 915
923 init_fw_cb->cookie = cpu_to_le32(0x11BEAD5A); 916 init_fw_cb->cookie = cpu_to_le32(0x11BEAD5A);