enum iscsi_param param, char *buf);
static int qla4xxx_host_get_param(struct Scsi_Host *shost,
enum iscsi_host_param param, char *buf);
-static int qla4xxx_iface_set_param(struct Scsi_Host *shost, char *data,
- int count);
+static int qla4xxx_iface_set_param(struct Scsi_Host *shost, void *data,
+ uint32_t len);
static int qla4xxx_get_iface_param(struct iscsi_iface *iface,
enum iscsi_param_type param_type,
int param, char *buf);
}
static int
-qla4xxx_iface_set_param(struct Scsi_Host *shost, char *data, int count)
+qla4xxx_iface_set_param(struct Scsi_Host *shost, void *data, uint32_t len)
{
struct scsi_qla_host *ha = to_qla_host(shost);
int rval = 0;
dma_addr_t init_fw_cb_dma;
uint32_t mbox_cmd[MBOX_REG_COUNT];
uint32_t mbox_sts[MBOX_REG_COUNT];
- uint32_t total_param_count;
- uint32_t length;
+ uint32_t rem = len;
+ struct nlattr *attr;
init_fw_cb = dma_alloc_coherent(&ha->pdev->dev,
sizeof(struct addr_ctrl_blk),
goto exit_init_fw_cb;
}
- total_param_count = count;
- iface_param = (struct iscsi_iface_param_info *)data;
-
- for ( ; total_param_count != 0; total_param_count--) {
- length = iface_param->len;
+ nla_for_each_attr(attr, data, len, rem) {
+ iface_param = nla_data(attr);
if (iface_param->param_type != ISCSI_NET_PARAM)
continue;
ql4_printk(KERN_ERR, ha, "Invalid iface type\n");
break;
}
-
- iface_param = (struct iscsi_iface_param_info *)
- ((uint8_t *)iface_param +
- sizeof(struct iscsi_iface_param_info) + length);
}
init_fw_cb->cookie = cpu_to_le32(0x11BEAD5A);
static int
iscsi_set_iface_params(struct iscsi_transport *transport,
- struct iscsi_uevent *ev)
+ struct iscsi_uevent *ev, uint32_t len)
{
char *data = (char *)ev + sizeof(*ev);
struct Scsi_Host *shost;
return -ENODEV;
}
- err = transport->set_iface_param(shost, data,
- ev->u.set_iface_params.count);
+ err = transport->set_iface_param(shost, data, len);
scsi_host_put(shost);
return err;
}
err = iscsi_set_path(transport, ev);
break;
case ISCSI_UEVENT_SET_IFACE_PARAMS:
- err = iscsi_set_iface_params(transport, ev);
+ err = iscsi_set_iface_params(transport, ev,
+ nlmsg_attrlen(nlh, sizeof(*ev)));
break;
default:
err = -ENOSYS;
int (*tgt_dscvr) (struct Scsi_Host *shost, enum iscsi_tgt_dscvr type,
uint32_t enable, struct sockaddr *dst_addr);
int (*set_path) (struct Scsi_Host *shost, struct iscsi_path *params);
- int (*set_iface_param) (struct Scsi_Host *shost, char *data, int count);
+ int (*set_iface_param) (struct Scsi_Host *shost, void *data,
+ uint32_t len);
int (*get_iface_param) (struct iscsi_iface *iface,
enum iscsi_param_type param_type,
int param, char *buf);