|
@@ -1784,6 +1784,8 @@ static int qeth_idx_activate_get_answer(struct qeth_channel *channel,
|
|
|
QETH_DBF_TEXT(SETUP, 2, "idxanswr");
|
|
|
card = CARD_FROM_CDEV(channel->ccwdev);
|
|
|
iob = qeth_get_buffer(channel);
|
|
|
+ if (!iob)
|
|
|
+ return -ENOMEM;
|
|
|
iob->callback = idx_reply_cb;
|
|
|
memcpy(&channel->ccw, READ_CCW, sizeof(struct ccw1));
|
|
|
channel->ccw.count = QETH_BUFSIZE;
|
|
@@ -1834,6 +1836,8 @@ static int qeth_idx_activate_channel(struct qeth_channel *channel,
|
|
|
QETH_DBF_TEXT(SETUP, 2, "idxactch");
|
|
|
|
|
|
iob = qeth_get_buffer(channel);
|
|
|
+ if (!iob)
|
|
|
+ return -ENOMEM;
|
|
|
iob->callback = idx_reply_cb;
|
|
|
memcpy(&channel->ccw, WRITE_CCW, sizeof(struct ccw1));
|
|
|
channel->ccw.count = IDX_ACTIVATE_SIZE;
|
|
@@ -2940,9 +2944,16 @@ struct qeth_cmd_buffer *qeth_get_ipacmd_buffer(struct qeth_card *card,
|
|
|
struct qeth_cmd_buffer *iob;
|
|
|
struct qeth_ipa_cmd *cmd;
|
|
|
|
|
|
- iob = qeth_wait_for_buffer(&card->write);
|
|
|
- cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
|
|
|
- qeth_fill_ipacmd_header(card, cmd, ipacmd, prot);
|
|
|
+ iob = qeth_get_buffer(&card->write);
|
|
|
+ if (iob) {
|
|
|
+ cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
|
|
|
+ qeth_fill_ipacmd_header(card, cmd, ipacmd, prot);
|
|
|
+ } else {
|
|
|
+ dev_warn(&card->gdev->dev,
|
|
|
+ "The qeth driver ran out of channel command buffers\n");
|
|
|
+ QETH_DBF_MESSAGE(1, "%s The qeth driver ran out of channel command buffers",
|
|
|
+ dev_name(&card->gdev->dev));
|
|
|
+ }
|
|
|
|
|
|
return iob;
|
|
|
}
|
|
@@ -3000,6 +3011,8 @@ int qeth_send_startlan(struct qeth_card *card)
|
|
|
QETH_DBF_TEXT(SETUP, 2, "strtlan");
|
|
|
|
|
|
iob = qeth_get_ipacmd_buffer(card, IPA_CMD_STARTLAN, 0);
|
|
|
+ if (!iob)
|
|
|
+ return -ENOMEM;
|
|
|
rc = qeth_send_ipa_cmd(card, iob, NULL, NULL);
|
|
|
return rc;
|
|
|
}
|
|
@@ -3045,11 +3058,13 @@ static struct qeth_cmd_buffer *qeth_get_adapter_cmd(struct qeth_card *card,
|
|
|
|
|
|
iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETADAPTERPARMS,
|
|
|
QETH_PROT_IPV4);
|
|
|
- cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
|
|
|
- cmd->data.setadapterparms.hdr.cmdlength = cmdlen;
|
|
|
- cmd->data.setadapterparms.hdr.command_code = command;
|
|
|
- cmd->data.setadapterparms.hdr.used_total = 1;
|
|
|
- cmd->data.setadapterparms.hdr.seq_no = 1;
|
|
|
+ if (iob) {
|
|
|
+ cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
|
|
|
+ cmd->data.setadapterparms.hdr.cmdlength = cmdlen;
|
|
|
+ cmd->data.setadapterparms.hdr.command_code = command;
|
|
|
+ cmd->data.setadapterparms.hdr.used_total = 1;
|
|
|
+ cmd->data.setadapterparms.hdr.seq_no = 1;
|
|
|
+ }
|
|
|
|
|
|
return iob;
|
|
|
}
|
|
@@ -3062,6 +3077,8 @@ int qeth_query_setadapterparms(struct qeth_card *card)
|
|
|
QETH_CARD_TEXT(card, 3, "queryadp");
|
|
|
iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_COMMANDS_SUPPORTED,
|
|
|
sizeof(struct qeth_ipacmd_setadpparms));
|
|
|
+ if (!iob)
|
|
|
+ return -ENOMEM;
|
|
|
rc = qeth_send_ipa_cmd(card, iob, qeth_query_setadapterparms_cb, NULL);
|
|
|
return rc;
|
|
|
}
|
|
@@ -3112,6 +3129,8 @@ int qeth_query_ipassists(struct qeth_card *card, enum qeth_prot_versions prot)
|
|
|
|
|
|
QETH_DBF_TEXT_(SETUP, 2, "qipassi%i", prot);
|
|
|
iob = qeth_get_ipacmd_buffer(card, IPA_CMD_QIPASSIST, prot);
|
|
|
+ if (!iob)
|
|
|
+ return -ENOMEM;
|
|
|
rc = qeth_send_ipa_cmd(card, iob, qeth_query_ipassists_cb, NULL);
|
|
|
return rc;
|
|
|
}
|
|
@@ -3151,6 +3170,8 @@ int qeth_query_switch_attributes(struct qeth_card *card,
|
|
|
return -ENOMEDIUM;
|
|
|
iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_SWITCH_ATTRIBUTES,
|
|
|
sizeof(struct qeth_ipacmd_setadpparms_hdr));
|
|
|
+ if (!iob)
|
|
|
+ return -ENOMEM;
|
|
|
return qeth_send_ipa_cmd(card, iob,
|
|
|
qeth_query_switch_attributes_cb, sw_info);
|
|
|
}
|
|
@@ -3178,6 +3199,8 @@ static int qeth_query_setdiagass(struct qeth_card *card)
|
|
|
|
|
|
QETH_DBF_TEXT(SETUP, 2, "qdiagass");
|
|
|
iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SET_DIAG_ASS, 0);
|
|
|
+ if (!iob)
|
|
|
+ return -ENOMEM;
|
|
|
cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
|
|
|
cmd->data.diagass.subcmd_len = 16;
|
|
|
cmd->data.diagass.subcmd = QETH_DIAGS_CMD_QUERY;
|
|
@@ -3229,6 +3252,8 @@ int qeth_hw_trap(struct qeth_card *card, enum qeth_diags_trap_action action)
|
|
|
|
|
|
QETH_DBF_TEXT(SETUP, 2, "diagtrap");
|
|
|
iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SET_DIAG_ASS, 0);
|
|
|
+ if (!iob)
|
|
|
+ return -ENOMEM;
|
|
|
cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
|
|
|
cmd->data.diagass.subcmd_len = 80;
|
|
|
cmd->data.diagass.subcmd = QETH_DIAGS_CMD_TRAP;
|
|
@@ -4194,6 +4219,8 @@ void qeth_setadp_promisc_mode(struct qeth_card *card)
|
|
|
|
|
|
iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_PROMISC_MODE,
|
|
|
sizeof(struct qeth_ipacmd_setadpparms));
|
|
|
+ if (!iob)
|
|
|
+ return;
|
|
|
cmd = (struct qeth_ipa_cmd *)(iob->data + IPA_PDU_HEADER_SIZE);
|
|
|
cmd->data.setadapterparms.data.mode = mode;
|
|
|
qeth_send_ipa_cmd(card, iob, qeth_setadp_promisc_mode_cb, NULL);
|
|
@@ -4264,6 +4291,8 @@ int qeth_setadpparms_change_macaddr(struct qeth_card *card)
|
|
|
|
|
|
iob = qeth_get_adapter_cmd(card, IPA_SETADP_ALTER_MAC_ADDRESS,
|
|
|
sizeof(struct qeth_ipacmd_setadpparms));
|
|
|
+ if (!iob)
|
|
|
+ return -ENOMEM;
|
|
|
cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
|
|
|
cmd->data.setadapterparms.data.change_addr.cmd = CHANGE_ADDR_READ_MAC;
|
|
|
cmd->data.setadapterparms.data.change_addr.addr_size = OSA_ADDR_LEN;
|
|
@@ -4377,6 +4406,8 @@ static int qeth_setadpparms_set_access_ctrl(struct qeth_card *card,
|
|
|
iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_ACCESS_CONTROL,
|
|
|
sizeof(struct qeth_ipacmd_setadpparms_hdr) +
|
|
|
sizeof(struct qeth_set_access_ctrl));
|
|
|
+ if (!iob)
|
|
|
+ return -ENOMEM;
|
|
|
cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
|
|
|
access_ctrl_req = &cmd->data.setadapterparms.data.set_access_ctrl;
|
|
|
access_ctrl_req->subcmd_code = isolation;
|
|
@@ -4620,6 +4651,10 @@ int qeth_snmp_command(struct qeth_card *card, char __user *udata)
|
|
|
|
|
|
iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_SNMP_CONTROL,
|
|
|
QETH_SNMP_SETADP_CMDLENGTH + req_len);
|
|
|
+ if (!iob) {
|
|
|
+ rc = -ENOMEM;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
|
|
|
memcpy(&cmd->data.setadapterparms.data.snmp, &ureq->cmd, req_len);
|
|
|
rc = qeth_send_ipa_snmp_cmd(card, iob, QETH_SETADP_BASE_LEN + req_len,
|
|
@@ -4631,7 +4666,7 @@ int qeth_snmp_command(struct qeth_card *card, char __user *udata)
|
|
|
if (copy_to_user(udata, qinfo.udata, qinfo.udata_len))
|
|
|
rc = -EFAULT;
|
|
|
}
|
|
|
-
|
|
|
+out:
|
|
|
kfree(ureq);
|
|
|
kfree(qinfo.udata);
|
|
|
return rc;
|
|
@@ -4702,6 +4737,10 @@ int qeth_query_oat_command(struct qeth_card *card, char __user *udata)
|
|
|
iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_OAT,
|
|
|
sizeof(struct qeth_ipacmd_setadpparms_hdr) +
|
|
|
sizeof(struct qeth_query_oat));
|
|
|
+ if (!iob) {
|
|
|
+ rc = -ENOMEM;
|
|
|
+ goto out_free;
|
|
|
+ }
|
|
|
cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
|
|
|
oat_req = &cmd->data.setadapterparms.data.query_oat;
|
|
|
oat_req->subcmd_code = oat_data.command;
|
|
@@ -4767,6 +4806,8 @@ static int qeth_query_card_info(struct qeth_card *card,
|
|
|
return -EOPNOTSUPP;
|
|
|
iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_CARD_INFO,
|
|
|
sizeof(struct qeth_ipacmd_setadpparms_hdr));
|
|
|
+ if (!iob)
|
|
|
+ return -ENOMEM;
|
|
|
return qeth_send_ipa_cmd(card, iob, qeth_query_card_info_cb,
|
|
|
(void *)carrier_info);
|
|
|
}
|
|
@@ -5092,11 +5133,23 @@ retriable:
|
|
|
card->options.adp.supported_funcs = 0;
|
|
|
card->options.sbp.supported_funcs = 0;
|
|
|
card->info.diagass_support = 0;
|
|
|
- qeth_query_ipassists(card, QETH_PROT_IPV4);
|
|
|
- if (qeth_is_supported(card, IPA_SETADAPTERPARMS))
|
|
|
- qeth_query_setadapterparms(card);
|
|
|
- if (qeth_adp_supported(card, IPA_SETADP_SET_DIAG_ASSIST))
|
|
|
- qeth_query_setdiagass(card);
|
|
|
+ rc = qeth_query_ipassists(card, QETH_PROT_IPV4);
|
|
|
+ if (rc == -ENOMEM)
|
|
|
+ goto out;
|
|
|
+ if (qeth_is_supported(card, IPA_SETADAPTERPARMS)) {
|
|
|
+ rc = qeth_query_setadapterparms(card);
|
|
|
+ if (rc < 0) {
|
|
|
+ QETH_DBF_TEXT_(SETUP, 2, "6err%d", rc);
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (qeth_adp_supported(card, IPA_SETADP_SET_DIAG_ASSIST)) {
|
|
|
+ rc = qeth_query_setdiagass(card);
|
|
|
+ if (rc < 0) {
|
|
|
+ QETH_DBF_TEXT_(SETUP, 2, "7err%d", rc);
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+ }
|
|
|
return 0;
|
|
|
out:
|
|
|
dev_warn(&card->gdev->dev, "The qeth device driver failed to recover "
|