mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 19:21:31 -04:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts: arch/arm/boot/dts/imx6sx-sdb.dts net/sched/cls_bpf.c Two simple sets of overlapping changes. Signed-off-by: David S. Miller <[email protected]>
This commit is contained in:
commit
95f873f2ff
457 changed files with 4418 additions and 3193 deletions
|
|
@ -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;
|
||||
|
|
@ -2021,10 +2025,36 @@ void qeth_prepare_control_data(struct qeth_card *card, int len,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(qeth_prepare_control_data);
|
||||
|
||||
/**
|
||||
* qeth_send_control_data() - send control command to the card
|
||||
* @card: qeth_card structure pointer
|
||||
* @len: size of the command buffer
|
||||
* @iob: qeth_cmd_buffer pointer
|
||||
* @reply_cb: callback function pointer
|
||||
* @cb_card: pointer to the qeth_card structure
|
||||
* @cb_reply: pointer to the qeth_reply structure
|
||||
* @cb_cmd: pointer to the original iob for non-IPA
|
||||
* commands, or to the qeth_ipa_cmd structure
|
||||
* for the IPA commands.
|
||||
* @reply_param: private pointer passed to the callback
|
||||
*
|
||||
* Returns the value of the `return_code' field of the response
|
||||
* block returned from the hardware, or other error indication.
|
||||
* Value of zero indicates successful execution of the command.
|
||||
*
|
||||
* Callback function gets called one or more times, with cb_cmd
|
||||
* pointing to the response returned by the hardware. Callback
|
||||
* function must return non-zero if more reply blocks are expected,
|
||||
* and zero if the last or only reply block is received. Callback
|
||||
* function can get the value of the reply_param pointer from the
|
||||
* field 'param' of the structure qeth_reply.
|
||||
*/
|
||||
|
||||
int qeth_send_control_data(struct qeth_card *card, int len,
|
||||
struct qeth_cmd_buffer *iob,
|
||||
int (*reply_cb)(struct qeth_card *, struct qeth_reply *,
|
||||
unsigned long),
|
||||
int (*reply_cb)(struct qeth_card *cb_card,
|
||||
struct qeth_reply *cb_reply,
|
||||
unsigned long cb_cmd),
|
||||
void *reply_param)
|
||||
{
|
||||
int rc;
|
||||
|
|
@ -2914,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;
|
||||
}
|
||||
|
|
@ -2932,6 +2969,12 @@ void qeth_prepare_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(qeth_prepare_ipa_cmd);
|
||||
|
||||
/**
|
||||
* qeth_send_ipa_cmd() - send an IPA command
|
||||
*
|
||||
* See qeth_send_control_data() for explanation of the arguments.
|
||||
*/
|
||||
|
||||
int qeth_send_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
|
||||
int (*reply_cb)(struct qeth_card *, struct qeth_reply*,
|
||||
unsigned long),
|
||||
|
|
@ -2968,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;
|
||||
}
|
||||
|
|
@ -3013,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;
|
||||
}
|
||||
|
|
@ -3030,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;
|
||||
}
|
||||
|
|
@ -3080,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;
|
||||
}
|
||||
|
|
@ -3119,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);
|
||||
}
|
||||
|
|
@ -3146,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;
|
||||
|
|
@ -3197,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;
|
||||
|
|
@ -4162,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);
|
||||
|
|
@ -4232,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;
|
||||
|
|
@ -4345,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;
|
||||
|
|
@ -4588,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,
|
||||
|
|
@ -4599,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;
|
||||
|
|
@ -4670,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;
|
||||
|
|
@ -4735,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);
|
||||
}
|
||||
|
|
@ -5060,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 "
|
||||
|
|
|
|||
|
|
@ -27,10 +27,7 @@ static int qeth_l2_set_offline(struct ccwgroup_device *);
|
|||
static int qeth_l2_stop(struct net_device *);
|
||||
static int qeth_l2_send_delmac(struct qeth_card *, __u8 *);
|
||||
static int qeth_l2_send_setdelmac(struct qeth_card *, __u8 *,
|
||||
enum qeth_ipa_cmds,
|
||||
int (*reply_cb) (struct qeth_card *,
|
||||
struct qeth_reply*,
|
||||
unsigned long));
|
||||
enum qeth_ipa_cmds);
|
||||
static void qeth_l2_set_multicast_list(struct net_device *);
|
||||
static int qeth_l2_recover(void *);
|
||||
static void qeth_bridgeport_query_support(struct qeth_card *card);
|
||||
|
|
@ -129,56 +126,71 @@ static struct net_device *qeth_l2_netdev_by_devno(unsigned char *read_dev_no)
|
|||
return ndev;
|
||||
}
|
||||
|
||||
static int qeth_l2_send_setgroupmac_cb(struct qeth_card *card,
|
||||
struct qeth_reply *reply,
|
||||
unsigned long data)
|
||||
static int qeth_setdel_makerc(struct qeth_card *card, int retcode)
|
||||
{
|
||||
struct qeth_ipa_cmd *cmd;
|
||||
__u8 *mac;
|
||||
int rc;
|
||||
|
||||
QETH_CARD_TEXT(card, 2, "L2Sgmacb");
|
||||
cmd = (struct qeth_ipa_cmd *) data;
|
||||
mac = &cmd->data.setdelmac.mac[0];
|
||||
/* MAC already registered, needed in couple/uncouple case */
|
||||
if (cmd->hdr.return_code == IPA_RC_L2_DUP_MAC) {
|
||||
QETH_DBF_MESSAGE(2, "Group MAC %pM already existing on %s \n",
|
||||
mac, QETH_CARD_IFNAME(card));
|
||||
cmd->hdr.return_code = 0;
|
||||
if (retcode)
|
||||
QETH_CARD_TEXT_(card, 2, "err%04x", retcode);
|
||||
switch (retcode) {
|
||||
case IPA_RC_SUCCESS:
|
||||
rc = 0;
|
||||
break;
|
||||
case IPA_RC_L2_UNSUPPORTED_CMD:
|
||||
rc = -ENOSYS;
|
||||
break;
|
||||
case IPA_RC_L2_ADDR_TABLE_FULL:
|
||||
rc = -ENOSPC;
|
||||
break;
|
||||
case IPA_RC_L2_DUP_MAC:
|
||||
case IPA_RC_L2_DUP_LAYER3_MAC:
|
||||
rc = -EEXIST;
|
||||
break;
|
||||
case IPA_RC_L2_MAC_NOT_AUTH_BY_HYP:
|
||||
case IPA_RC_L2_MAC_NOT_AUTH_BY_ADP:
|
||||
rc = -EPERM;
|
||||
break;
|
||||
case IPA_RC_L2_MAC_NOT_FOUND:
|
||||
rc = -ENOENT;
|
||||
break;
|
||||
case -ENOMEM:
|
||||
rc = -ENOMEM;
|
||||
break;
|
||||
default:
|
||||
rc = -EIO;
|
||||
break;
|
||||
}
|
||||
if (cmd->hdr.return_code)
|
||||
QETH_DBF_MESSAGE(2, "Could not set group MAC %pM on %s: %x\n",
|
||||
mac, QETH_CARD_IFNAME(card), cmd->hdr.return_code);
|
||||
return 0;
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int qeth_l2_send_setgroupmac(struct qeth_card *card, __u8 *mac)
|
||||
{
|
||||
int rc;
|
||||
|
||||
QETH_CARD_TEXT(card, 2, "L2Sgmac");
|
||||
return qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETGMAC,
|
||||
qeth_l2_send_setgroupmac_cb);
|
||||
}
|
||||
|
||||
static int qeth_l2_send_delgroupmac_cb(struct qeth_card *card,
|
||||
struct qeth_reply *reply,
|
||||
unsigned long data)
|
||||
{
|
||||
struct qeth_ipa_cmd *cmd;
|
||||
__u8 *mac;
|
||||
|
||||
QETH_CARD_TEXT(card, 2, "L2Dgmacb");
|
||||
cmd = (struct qeth_ipa_cmd *) data;
|
||||
mac = &cmd->data.setdelmac.mac[0];
|
||||
if (cmd->hdr.return_code)
|
||||
QETH_DBF_MESSAGE(2, "Could not delete group MAC %pM on %s: %x\n",
|
||||
mac, QETH_CARD_IFNAME(card), cmd->hdr.return_code);
|
||||
return 0;
|
||||
rc = qeth_setdel_makerc(card, qeth_l2_send_setdelmac(card, mac,
|
||||
IPA_CMD_SETGMAC));
|
||||
if (rc == -EEXIST)
|
||||
QETH_DBF_MESSAGE(2, "Group MAC %pM already existing on %s\n",
|
||||
mac, QETH_CARD_IFNAME(card));
|
||||
else if (rc)
|
||||
QETH_DBF_MESSAGE(2, "Could not set group MAC %pM on %s: %d\n",
|
||||
mac, QETH_CARD_IFNAME(card), rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int qeth_l2_send_delgroupmac(struct qeth_card *card, __u8 *mac)
|
||||
{
|
||||
int rc;
|
||||
|
||||
QETH_CARD_TEXT(card, 2, "L2Dgmac");
|
||||
return qeth_l2_send_setdelmac(card, mac, IPA_CMD_DELGMAC,
|
||||
qeth_l2_send_delgroupmac_cb);
|
||||
rc = qeth_setdel_makerc(card, qeth_l2_send_setdelmac(card, mac,
|
||||
IPA_CMD_DELGMAC));
|
||||
if (rc)
|
||||
QETH_DBF_MESSAGE(2,
|
||||
"Could not delete group MAC %pM on %s: %d\n",
|
||||
mac, QETH_CARD_IFNAME(card), rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void qeth_l2_add_mc(struct qeth_card *card, __u8 *mac, int vmac)
|
||||
|
|
@ -196,10 +208,11 @@ static void qeth_l2_add_mc(struct qeth_card *card, __u8 *mac, int vmac)
|
|||
mc->is_vmac = vmac;
|
||||
|
||||
if (vmac) {
|
||||
rc = qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETVMAC,
|
||||
NULL);
|
||||
rc = qeth_setdel_makerc(card,
|
||||
qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETVMAC));
|
||||
} else {
|
||||
rc = qeth_l2_send_setgroupmac(card, mac);
|
||||
rc = qeth_setdel_makerc(card,
|
||||
qeth_l2_send_setgroupmac(card, mac));
|
||||
}
|
||||
|
||||
if (!rc)
|
||||
|
|
@ -217,7 +230,7 @@ static void qeth_l2_del_all_mc(struct qeth_card *card, int del)
|
|||
if (del) {
|
||||
if (mc->is_vmac)
|
||||
qeth_l2_send_setdelmac(card, mc->mc_addr,
|
||||
IPA_CMD_DELVMAC, NULL);
|
||||
IPA_CMD_DELVMAC);
|
||||
else
|
||||
qeth_l2_send_delgroupmac(card, mc->mc_addr);
|
||||
}
|
||||
|
|
@ -290,6 +303,8 @@ static int qeth_l2_send_setdelvlan(struct qeth_card *card, __u16 i,
|
|||
|
||||
QETH_CARD_TEXT_(card, 4, "L2sdv%x", ipacmd);
|
||||
iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4);
|
||||
if (!iob)
|
||||
return -ENOMEM;
|
||||
cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
|
||||
cmd->data.setdelvlan.vlan_id = i;
|
||||
return qeth_send_ipa_cmd(card, iob,
|
||||
|
|
@ -312,6 +327,7 @@ static int qeth_l2_vlan_rx_add_vid(struct net_device *dev,
|
|||
{
|
||||
struct qeth_card *card = dev->ml_priv;
|
||||
struct qeth_vlan_vid *id;
|
||||
int rc;
|
||||
|
||||
QETH_CARD_TEXT_(card, 4, "aid:%d", vid);
|
||||
if (!vid)
|
||||
|
|
@ -327,7 +343,11 @@ static int qeth_l2_vlan_rx_add_vid(struct net_device *dev,
|
|||
id = kmalloc(sizeof(struct qeth_vlan_vid), GFP_ATOMIC);
|
||||
if (id) {
|
||||
id->vid = vid;
|
||||
qeth_l2_send_setdelvlan(card, vid, IPA_CMD_SETVLAN);
|
||||
rc = qeth_l2_send_setdelvlan(card, vid, IPA_CMD_SETVLAN);
|
||||
if (rc) {
|
||||
kfree(id);
|
||||
return rc;
|
||||
}
|
||||
spin_lock_bh(&card->vlanlock);
|
||||
list_add_tail(&id->list, &card->vid_list);
|
||||
spin_unlock_bh(&card->vlanlock);
|
||||
|
|
@ -342,6 +362,7 @@ static int qeth_l2_vlan_rx_kill_vid(struct net_device *dev,
|
|||
{
|
||||
struct qeth_vlan_vid *id, *tmpid = NULL;
|
||||
struct qeth_card *card = dev->ml_priv;
|
||||
int rc = 0;
|
||||
|
||||
QETH_CARD_TEXT_(card, 4, "kid:%d", vid);
|
||||
if (card->info.type == QETH_CARD_TYPE_OSM) {
|
||||
|
|
@ -362,11 +383,11 @@ static int qeth_l2_vlan_rx_kill_vid(struct net_device *dev,
|
|||
}
|
||||
spin_unlock_bh(&card->vlanlock);
|
||||
if (tmpid) {
|
||||
qeth_l2_send_setdelvlan(card, vid, IPA_CMD_DELVLAN);
|
||||
rc = qeth_l2_send_setdelvlan(card, vid, IPA_CMD_DELVLAN);
|
||||
kfree(tmpid);
|
||||
}
|
||||
qeth_l2_set_multicast_list(card->dev);
|
||||
return 0;
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int qeth_l2_stop_card(struct qeth_card *card, int recovery_mode)
|
||||
|
|
@ -538,91 +559,62 @@ out:
|
|||
}
|
||||
|
||||
static int qeth_l2_send_setdelmac(struct qeth_card *card, __u8 *mac,
|
||||
enum qeth_ipa_cmds ipacmd,
|
||||
int (*reply_cb) (struct qeth_card *,
|
||||
struct qeth_reply*,
|
||||
unsigned long))
|
||||
enum qeth_ipa_cmds ipacmd)
|
||||
{
|
||||
struct qeth_ipa_cmd *cmd;
|
||||
struct qeth_cmd_buffer *iob;
|
||||
|
||||
QETH_CARD_TEXT(card, 2, "L2sdmac");
|
||||
iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4);
|
||||
if (!iob)
|
||||
return -ENOMEM;
|
||||
cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
|
||||
cmd->data.setdelmac.mac_length = OSA_ADDR_LEN;
|
||||
memcpy(&cmd->data.setdelmac.mac, mac, OSA_ADDR_LEN);
|
||||
return qeth_send_ipa_cmd(card, iob, reply_cb, NULL);
|
||||
}
|
||||
|
||||
static int qeth_l2_send_setmac_cb(struct qeth_card *card,
|
||||
struct qeth_reply *reply,
|
||||
unsigned long data)
|
||||
{
|
||||
struct qeth_ipa_cmd *cmd;
|
||||
|
||||
QETH_CARD_TEXT(card, 2, "L2Smaccb");
|
||||
cmd = (struct qeth_ipa_cmd *) data;
|
||||
if (cmd->hdr.return_code) {
|
||||
QETH_CARD_TEXT_(card, 2, "L2er%x", cmd->hdr.return_code);
|
||||
card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED;
|
||||
switch (cmd->hdr.return_code) {
|
||||
case IPA_RC_L2_DUP_MAC:
|
||||
case IPA_RC_L2_DUP_LAYER3_MAC:
|
||||
dev_warn(&card->gdev->dev,
|
||||
"MAC address %pM already exists\n",
|
||||
cmd->data.setdelmac.mac);
|
||||
break;
|
||||
case IPA_RC_L2_MAC_NOT_AUTH_BY_HYP:
|
||||
case IPA_RC_L2_MAC_NOT_AUTH_BY_ADP:
|
||||
dev_warn(&card->gdev->dev,
|
||||
"MAC address %pM is not authorized\n",
|
||||
cmd->data.setdelmac.mac);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
card->info.mac_bits |= QETH_LAYER2_MAC_REGISTERED;
|
||||
memcpy(card->dev->dev_addr, cmd->data.setdelmac.mac,
|
||||
OSA_ADDR_LEN);
|
||||
dev_info(&card->gdev->dev,
|
||||
"MAC address %pM successfully registered on device %s\n",
|
||||
card->dev->dev_addr, card->dev->name);
|
||||
}
|
||||
return 0;
|
||||
return qeth_send_ipa_cmd(card, iob, NULL, NULL);
|
||||
}
|
||||
|
||||
static int qeth_l2_send_setmac(struct qeth_card *card, __u8 *mac)
|
||||
{
|
||||
int rc;
|
||||
|
||||
QETH_CARD_TEXT(card, 2, "L2Setmac");
|
||||
return qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETVMAC,
|
||||
qeth_l2_send_setmac_cb);
|
||||
}
|
||||
|
||||
static int qeth_l2_send_delmac_cb(struct qeth_card *card,
|
||||
struct qeth_reply *reply,
|
||||
unsigned long data)
|
||||
{
|
||||
struct qeth_ipa_cmd *cmd;
|
||||
|
||||
QETH_CARD_TEXT(card, 2, "L2Dmaccb");
|
||||
cmd = (struct qeth_ipa_cmd *) data;
|
||||
if (cmd->hdr.return_code) {
|
||||
QETH_CARD_TEXT_(card, 2, "err%d", cmd->hdr.return_code);
|
||||
return 0;
|
||||
rc = qeth_setdel_makerc(card, qeth_l2_send_setdelmac(card, mac,
|
||||
IPA_CMD_SETVMAC));
|
||||
if (rc == 0) {
|
||||
card->info.mac_bits |= QETH_LAYER2_MAC_REGISTERED;
|
||||
memcpy(card->dev->dev_addr, mac, OSA_ADDR_LEN);
|
||||
dev_info(&card->gdev->dev,
|
||||
"MAC address %pM successfully registered on device %s\n",
|
||||
card->dev->dev_addr, card->dev->name);
|
||||
} else {
|
||||
card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED;
|
||||
switch (rc) {
|
||||
case -EEXIST:
|
||||
dev_warn(&card->gdev->dev,
|
||||
"MAC address %pM already exists\n", mac);
|
||||
break;
|
||||
case -EPERM:
|
||||
dev_warn(&card->gdev->dev,
|
||||
"MAC address %pM is not authorized\n", mac);
|
||||
break;
|
||||
}
|
||||
}
|
||||
card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED;
|
||||
|
||||
return 0;
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int qeth_l2_send_delmac(struct qeth_card *card, __u8 *mac)
|
||||
{
|
||||
int rc;
|
||||
|
||||
QETH_CARD_TEXT(card, 2, "L2Delmac");
|
||||
if (!(card->info.mac_bits & QETH_LAYER2_MAC_REGISTERED))
|
||||
return 0;
|
||||
return qeth_l2_send_setdelmac(card, mac, IPA_CMD_DELVMAC,
|
||||
qeth_l2_send_delmac_cb);
|
||||
rc = qeth_setdel_makerc(card, qeth_l2_send_setdelmac(card, mac,
|
||||
IPA_CMD_DELVMAC));
|
||||
if (rc == 0)
|
||||
card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED;
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int qeth_l2_request_initial_mac(struct qeth_card *card)
|
||||
|
|
@ -650,7 +642,7 @@ static int qeth_l2_request_initial_mac(struct qeth_card *card)
|
|||
if (rc) {
|
||||
QETH_DBF_MESSAGE(2, "couldn't get MAC address on "
|
||||
"device %s: x%x\n", CARD_BUS_ID(card), rc);
|
||||
QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
|
||||
QETH_DBF_TEXT_(SETUP, 2, "1err%04x", rc);
|
||||
return rc;
|
||||
}
|
||||
QETH_DBF_HEX(SETUP, 2, card->dev->dev_addr, OSA_ADDR_LEN);
|
||||
|
|
@ -686,7 +678,7 @@ static int qeth_l2_set_mac_address(struct net_device *dev, void *p)
|
|||
return -ERESTARTSYS;
|
||||
}
|
||||
rc = qeth_l2_send_delmac(card, &card->dev->dev_addr[0]);
|
||||
if (!rc || (rc == IPA_RC_L2_MAC_NOT_FOUND))
|
||||
if (!rc || (rc == -ENOENT))
|
||||
rc = qeth_l2_send_setmac(card, addr->sa_data);
|
||||
return rc ? -EINVAL : 0;
|
||||
}
|
||||
|
|
@ -995,7 +987,7 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode)
|
|||
recover_flag = card->state;
|
||||
rc = qeth_core_hardsetup_card(card);
|
||||
if (rc) {
|
||||
QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc);
|
||||
QETH_DBF_TEXT_(SETUP, 2, "2err%04x", rc);
|
||||
rc = -ENODEV;
|
||||
goto out_remove;
|
||||
}
|
||||
|
|
@ -1728,6 +1720,8 @@ static void qeth_bridgeport_query_support(struct qeth_card *card)
|
|||
|
||||
QETH_CARD_TEXT(card, 2, "brqsuppo");
|
||||
iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETBRIDGEPORT, 0);
|
||||
if (!iob)
|
||||
return;
|
||||
cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
|
||||
cmd->data.sbp.hdr.cmdlength =
|
||||
sizeof(struct qeth_ipacmd_sbp_hdr) +
|
||||
|
|
@ -1803,6 +1797,8 @@ int qeth_bridgeport_query_ports(struct qeth_card *card,
|
|||
if (!(card->options.sbp.supported_funcs & IPA_SBP_QUERY_BRIDGE_PORTS))
|
||||
return -EOPNOTSUPP;
|
||||
iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETBRIDGEPORT, 0);
|
||||
if (!iob)
|
||||
return -ENOMEM;
|
||||
cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
|
||||
cmd->data.sbp.hdr.cmdlength =
|
||||
sizeof(struct qeth_ipacmd_sbp_hdr);
|
||||
|
|
@ -1815,9 +1811,7 @@ int qeth_bridgeport_query_ports(struct qeth_card *card,
|
|||
if (rc)
|
||||
return rc;
|
||||
rc = qeth_bridgeport_makerc(card, &cbctl, IPA_SBP_QUERY_BRIDGE_PORTS);
|
||||
if (rc)
|
||||
return rc;
|
||||
return 0;
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qeth_bridgeport_query_ports);
|
||||
|
||||
|
|
@ -1871,6 +1865,8 @@ int qeth_bridgeport_setrole(struct qeth_card *card, enum qeth_sbp_roles role)
|
|||
if (!(card->options.sbp.supported_funcs & setcmd))
|
||||
return -EOPNOTSUPP;
|
||||
iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETBRIDGEPORT, 0);
|
||||
if (!iob)
|
||||
return -ENOMEM;
|
||||
cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
|
||||
cmd->data.sbp.hdr.cmdlength = cmdlength;
|
||||
cmd->data.sbp.hdr.command_code = setcmd;
|
||||
|
|
|
|||
|
|
@ -547,6 +547,8 @@ static int qeth_l3_send_setdelmc(struct qeth_card *card,
|
|||
QETH_CARD_TEXT(card, 4, "setdelmc");
|
||||
|
||||
iob = qeth_get_ipacmd_buffer(card, ipacmd, addr->proto);
|
||||
if (!iob)
|
||||
return -ENOMEM;
|
||||
cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
|
||||
memcpy(&cmd->data.setdelipm.mac, addr->mac, OSA_ADDR_LEN);
|
||||
if (addr->proto == QETH_PROT_IPV6)
|
||||
|
|
@ -586,6 +588,8 @@ static int qeth_l3_send_setdelip(struct qeth_card *card,
|
|||
QETH_CARD_TEXT_(card, 4, "flags%02X", flags);
|
||||
|
||||
iob = qeth_get_ipacmd_buffer(card, ipacmd, addr->proto);
|
||||
if (!iob)
|
||||
return -ENOMEM;
|
||||
cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
|
||||
if (addr->proto == QETH_PROT_IPV6) {
|
||||
memcpy(cmd->data.setdelip6.ip_addr, &addr->u.a6.addr,
|
||||
|
|
@ -614,6 +618,8 @@ static int qeth_l3_send_setrouting(struct qeth_card *card,
|
|||
|
||||
QETH_CARD_TEXT(card, 4, "setroutg");
|
||||
iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETRTG, prot);
|
||||
if (!iob)
|
||||
return -ENOMEM;
|
||||
cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
|
||||
cmd->data.setrtg.type = (type);
|
||||
rc = qeth_send_ipa_cmd(card, iob, NULL, NULL);
|
||||
|
|
@ -1047,12 +1053,14 @@ static struct qeth_cmd_buffer *qeth_l3_get_setassparms_cmd(
|
|||
QETH_CARD_TEXT(card, 4, "getasscm");
|
||||
iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETASSPARMS, prot);
|
||||
|
||||
cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
|
||||
cmd->data.setassparms.hdr.assist_no = ipa_func;
|
||||
cmd->data.setassparms.hdr.length = 8 + len;
|
||||
cmd->data.setassparms.hdr.command_code = cmd_code;
|
||||
cmd->data.setassparms.hdr.return_code = 0;
|
||||
cmd->data.setassparms.hdr.seq_no = 0;
|
||||
if (iob) {
|
||||
cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
|
||||
cmd->data.setassparms.hdr.assist_no = ipa_func;
|
||||
cmd->data.setassparms.hdr.length = 8 + len;
|
||||
cmd->data.setassparms.hdr.command_code = cmd_code;
|
||||
cmd->data.setassparms.hdr.return_code = 0;
|
||||
cmd->data.setassparms.hdr.seq_no = 0;
|
||||
}
|
||||
|
||||
return iob;
|
||||
}
|
||||
|
|
@ -1088,6 +1096,8 @@ static int qeth_l3_send_simple_setassparms_ipv6(struct qeth_card *card,
|
|||
QETH_CARD_TEXT(card, 4, "simassp6");
|
||||
iob = qeth_l3_get_setassparms_cmd(card, ipa_func, cmd_code,
|
||||
0, QETH_PROT_IPV6);
|
||||
if (!iob)
|
||||
return -ENOMEM;
|
||||
rc = qeth_l3_send_setassparms(card, iob, 0, 0,
|
||||
qeth_l3_default_setassparms_cb, NULL);
|
||||
return rc;
|
||||
|
|
@ -1106,6 +1116,8 @@ static int qeth_l3_send_simple_setassparms(struct qeth_card *card,
|
|||
length = sizeof(__u32);
|
||||
iob = qeth_l3_get_setassparms_cmd(card, ipa_func, cmd_code,
|
||||
length, QETH_PROT_IPV4);
|
||||
if (!iob)
|
||||
return -ENOMEM;
|
||||
rc = qeth_l3_send_setassparms(card, iob, length, data,
|
||||
qeth_l3_default_setassparms_cb, NULL);
|
||||
return rc;
|
||||
|
|
@ -1492,6 +1504,8 @@ static int qeth_l3_iqd_read_initial_mac(struct qeth_card *card)
|
|||
|
||||
iob = qeth_get_ipacmd_buffer(card, IPA_CMD_CREATE_ADDR,
|
||||
QETH_PROT_IPV6);
|
||||
if (!iob)
|
||||
return -ENOMEM;
|
||||
cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
|
||||
*((__u16 *) &cmd->data.create_destroy_addr.unique_id[6]) =
|
||||
card->info.unique_id;
|
||||
|
|
@ -1535,6 +1549,8 @@ static int qeth_l3_get_unique_id(struct qeth_card *card)
|
|||
|
||||
iob = qeth_get_ipacmd_buffer(card, IPA_CMD_CREATE_ADDR,
|
||||
QETH_PROT_IPV6);
|
||||
if (!iob)
|
||||
return -ENOMEM;
|
||||
cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
|
||||
*((__u16 *) &cmd->data.create_destroy_addr.unique_id[6]) =
|
||||
card->info.unique_id;
|
||||
|
|
@ -1609,6 +1625,8 @@ qeth_diags_trace(struct qeth_card *card, enum qeth_diags_trace_cmds diags_cmd)
|
|||
QETH_DBF_TEXT(SETUP, 2, "diagtrac");
|
||||
|
||||
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_TRACE;
|
||||
|
|
@ -2440,6 +2458,8 @@ static int qeth_l3_query_arp_cache_info(struct qeth_card *card,
|
|||
IPA_CMD_ASS_ARP_QUERY_INFO,
|
||||
sizeof(struct qeth_arp_query_data) - sizeof(char),
|
||||
prot);
|
||||
if (!iob)
|
||||
return -ENOMEM;
|
||||
cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
|
||||
cmd->data.setassparms.data.query_arp.request_bits = 0x000F;
|
||||
cmd->data.setassparms.data.query_arp.reply_bits = 0;
|
||||
|
|
@ -2533,6 +2553,8 @@ static int qeth_l3_arp_add_entry(struct qeth_card *card,
|
|||
IPA_CMD_ASS_ARP_ADD_ENTRY,
|
||||
sizeof(struct qeth_arp_cache_entry),
|
||||
QETH_PROT_IPV4);
|
||||
if (!iob)
|
||||
return -ENOMEM;
|
||||
rc = qeth_l3_send_setassparms(card, iob,
|
||||
sizeof(struct qeth_arp_cache_entry),
|
||||
(unsigned long) entry,
|
||||
|
|
@ -2572,6 +2594,8 @@ static int qeth_l3_arp_remove_entry(struct qeth_card *card,
|
|||
IPA_CMD_ASS_ARP_REMOVE_ENTRY,
|
||||
12,
|
||||
QETH_PROT_IPV4);
|
||||
if (!iob)
|
||||
return -ENOMEM;
|
||||
rc = qeth_l3_send_setassparms(card, iob,
|
||||
12, (unsigned long)buf,
|
||||
qeth_l3_default_setassparms_cb, NULL);
|
||||
|
|
@ -3259,6 +3283,8 @@ static const struct net_device_ops qeth_l3_osa_netdev_ops = {
|
|||
|
||||
static int qeth_l3_setup_netdev(struct qeth_card *card)
|
||||
{
|
||||
int rc;
|
||||
|
||||
if (card->info.type == QETH_CARD_TYPE_OSD ||
|
||||
card->info.type == QETH_CARD_TYPE_OSX) {
|
||||
if ((card->info.link_type == QETH_LINK_TYPE_LANE_TR) ||
|
||||
|
|
@ -3290,7 +3316,9 @@ static int qeth_l3_setup_netdev(struct qeth_card *card)
|
|||
return -ENODEV;
|
||||
card->dev->flags |= IFF_NOARP;
|
||||
card->dev->netdev_ops = &qeth_l3_netdev_ops;
|
||||
qeth_l3_iqd_read_initial_mac(card);
|
||||
rc = qeth_l3_iqd_read_initial_mac(card);
|
||||
if (rc)
|
||||
return rc;
|
||||
if (card->options.hsuid[0])
|
||||
memcpy(card->dev->perm_addr, card->options.hsuid, 9);
|
||||
} else
|
||||
|
|
@ -3357,7 +3385,7 @@ static int __qeth_l3_set_online(struct ccwgroup_device *gdev, int recovery_mode)
|
|||
recover_flag = card->state;
|
||||
rc = qeth_core_hardsetup_card(card);
|
||||
if (rc) {
|
||||
QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc);
|
||||
QETH_DBF_TEXT_(SETUP, 2, "2err%04x", rc);
|
||||
rc = -ENODEV;
|
||||
goto out_remove;
|
||||
}
|
||||
|
|
@ -3398,7 +3426,7 @@ static int __qeth_l3_set_online(struct ccwgroup_device *gdev, int recovery_mode)
|
|||
contin:
|
||||
rc = qeth_l3_setadapter_parms(card);
|
||||
if (rc)
|
||||
QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc);
|
||||
QETH_DBF_TEXT_(SETUP, 2, "2err%04x", rc);
|
||||
if (!card->options.sniffer) {
|
||||
rc = qeth_l3_start_ipassists(card);
|
||||
if (rc) {
|
||||
|
|
@ -3407,10 +3435,10 @@ contin:
|
|||
}
|
||||
rc = qeth_l3_setrouting_v4(card);
|
||||
if (rc)
|
||||
QETH_DBF_TEXT_(SETUP, 2, "4err%d", rc);
|
||||
QETH_DBF_TEXT_(SETUP, 2, "4err%04x", rc);
|
||||
rc = qeth_l3_setrouting_v6(card);
|
||||
if (rc)
|
||||
QETH_DBF_TEXT_(SETUP, 2, "5err%d", rc);
|
||||
QETH_DBF_TEXT_(SETUP, 2, "5err%04x", rc);
|
||||
}
|
||||
netif_tx_disable(card->dev);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue