Commit 21fe8af4 authored by David S. Miller's avatar David S. Miller

Merge branch 's390-next'

Ursula Braun says:

====================
s390: qeth and iucv patches

here is version 2 of some s390 related qeth patches for net-next. The patch by
Thomas Richter adds a new feature to the qeth layer2 code; the remaining
patches are minor improvements.
Version 2 of patch 4 uses the desired indentation in function declarations
and definitions spanning multiple lines in almost all cases. Thomas run into a
conflict with the maximum number of columns once. Thus you will still see one
function definition using an earlier column before the opening paranthesis.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 5dcd2461 91e60eb6
...@@ -229,7 +229,7 @@ static struct mon_msg *mon_next_message(struct mon_private *monpriv) ...@@ -229,7 +229,7 @@ static struct mon_msg *mon_next_message(struct mon_private *monpriv)
/****************************************************************************** /******************************************************************************
* IUCV handler * * IUCV handler *
*****************************************************************************/ *****************************************************************************/
static void mon_iucv_path_complete(struct iucv_path *path, u8 ipuser[16]) static void mon_iucv_path_complete(struct iucv_path *path, u8 *ipuser)
{ {
struct mon_private *monpriv = path->private; struct mon_private *monpriv = path->private;
...@@ -237,7 +237,7 @@ static void mon_iucv_path_complete(struct iucv_path *path, u8 ipuser[16]) ...@@ -237,7 +237,7 @@ static void mon_iucv_path_complete(struct iucv_path *path, u8 ipuser[16])
wake_up(&mon_conn_wait_queue); wake_up(&mon_conn_wait_queue);
} }
static void mon_iucv_path_severed(struct iucv_path *path, u8 ipuser[16]) static void mon_iucv_path_severed(struct iucv_path *path, u8 *ipuser)
{ {
struct mon_private *monpriv = path->private; struct mon_private *monpriv = path->private;
......
...@@ -99,8 +99,8 @@ static const struct file_operations vmlogrdr_fops = { ...@@ -99,8 +99,8 @@ static const struct file_operations vmlogrdr_fops = {
}; };
static void vmlogrdr_iucv_path_complete(struct iucv_path *, u8 ipuser[16]); static void vmlogrdr_iucv_path_complete(struct iucv_path *, u8 *ipuser);
static void vmlogrdr_iucv_path_severed(struct iucv_path *, u8 ipuser[16]); static void vmlogrdr_iucv_path_severed(struct iucv_path *, u8 *ipuser);
static void vmlogrdr_iucv_message_pending(struct iucv_path *, static void vmlogrdr_iucv_message_pending(struct iucv_path *,
struct iucv_message *); struct iucv_message *);
...@@ -160,7 +160,7 @@ static struct cdev *vmlogrdr_cdev = NULL; ...@@ -160,7 +160,7 @@ static struct cdev *vmlogrdr_cdev = NULL;
static int recording_class_AB; static int recording_class_AB;
static void vmlogrdr_iucv_path_complete(struct iucv_path *path, u8 ipuser[16]) static void vmlogrdr_iucv_path_complete(struct iucv_path *path, u8 *ipuser)
{ {
struct vmlogrdr_priv_t * logptr = path->private; struct vmlogrdr_priv_t * logptr = path->private;
...@@ -171,7 +171,7 @@ static void vmlogrdr_iucv_path_complete(struct iucv_path *path, u8 ipuser[16]) ...@@ -171,7 +171,7 @@ static void vmlogrdr_iucv_path_complete(struct iucv_path *path, u8 ipuser[16])
} }
static void vmlogrdr_iucv_path_severed(struct iucv_path *path, u8 ipuser[16]) static void vmlogrdr_iucv_path_severed(struct iucv_path *path, u8 *ipuser)
{ {
struct vmlogrdr_priv_t * logptr = path->private; struct vmlogrdr_priv_t * logptr = path->private;
u8 reason = (u8) ipuser[8]; u8 reason = (u8) ipuser[8];
......
...@@ -149,12 +149,11 @@ static struct device_driver netiucv_driver = { ...@@ -149,12 +149,11 @@ static struct device_driver netiucv_driver = {
.pm = &netiucv_pm_ops, .pm = &netiucv_pm_ops,
}; };
static int netiucv_callback_connreq(struct iucv_path *, static int netiucv_callback_connreq(struct iucv_path *, u8 *, u8 *);
u8 ipvmid[8], u8 ipuser[16]); static void netiucv_callback_connack(struct iucv_path *, u8 *);
static void netiucv_callback_connack(struct iucv_path *, u8 ipuser[16]); static void netiucv_callback_connrej(struct iucv_path *, u8 *);
static void netiucv_callback_connrej(struct iucv_path *, u8 ipuser[16]); static void netiucv_callback_connsusp(struct iucv_path *, u8 *);
static void netiucv_callback_connsusp(struct iucv_path *, u8 ipuser[16]); static void netiucv_callback_connres(struct iucv_path *, u8 *);
static void netiucv_callback_connres(struct iucv_path *, u8 ipuser[16]);
static void netiucv_callback_rx(struct iucv_path *, struct iucv_message *); static void netiucv_callback_rx(struct iucv_path *, struct iucv_message *);
static void netiucv_callback_txdone(struct iucv_path *, struct iucv_message *); static void netiucv_callback_txdone(struct iucv_path *, struct iucv_message *);
...@@ -556,8 +555,8 @@ static void netiucv_callback_connack(struct iucv_path *path, u8 ipuser[16]) ...@@ -556,8 +555,8 @@ static void netiucv_callback_connack(struct iucv_path *path, u8 ipuser[16])
fsm_event(conn->fsm, CONN_EVENT_CONN_ACK, conn); fsm_event(conn->fsm, CONN_EVENT_CONN_ACK, conn);
} }
static int netiucv_callback_connreq(struct iucv_path *path, static int netiucv_callback_connreq(struct iucv_path *path, u8 *ipvmid,
u8 ipvmid[8], u8 ipuser[16]) u8 *ipuser)
{ {
struct iucv_connection *conn = path->private; struct iucv_connection *conn = path->private;
struct iucv_event ev; struct iucv_event ev;
...@@ -587,21 +586,21 @@ static int netiucv_callback_connreq(struct iucv_path *path, ...@@ -587,21 +586,21 @@ static int netiucv_callback_connreq(struct iucv_path *path,
return rc; return rc;
} }
static void netiucv_callback_connrej(struct iucv_path *path, u8 ipuser[16]) static void netiucv_callback_connrej(struct iucv_path *path, u8 *ipuser)
{ {
struct iucv_connection *conn = path->private; struct iucv_connection *conn = path->private;
fsm_event(conn->fsm, CONN_EVENT_CONN_REJ, conn); fsm_event(conn->fsm, CONN_EVENT_CONN_REJ, conn);
} }
static void netiucv_callback_connsusp(struct iucv_path *path, u8 ipuser[16]) static void netiucv_callback_connsusp(struct iucv_path *path, u8 *ipuser)
{ {
struct iucv_connection *conn = path->private; struct iucv_connection *conn = path->private;
fsm_event(conn->fsm, CONN_EVENT_CONN_SUS, conn); fsm_event(conn->fsm, CONN_EVENT_CONN_SUS, conn);
} }
static void netiucv_callback_connres(struct iucv_path *path, u8 ipuser[16]) static void netiucv_callback_connres(struct iucv_path *path, u8 *ipuser)
{ {
struct iucv_connection *conn = path->private; struct iucv_connection *conn = path->private;
......
...@@ -663,9 +663,7 @@ struct qeth_card_info { ...@@ -663,9 +663,7 @@ struct qeth_card_info {
char mcl_level[QETH_MCL_LENGTH + 1]; char mcl_level[QETH_MCL_LENGTH + 1];
int guestlan; int guestlan;
int mac_bits; int mac_bits;
int portname_required;
int portno; int portno;
char portname[9];
enum qeth_card_types type; enum qeth_card_types type;
enum qeth_link_types link_type; enum qeth_link_types link_type;
int is_multicast_different; int is_multicast_different;
...@@ -969,6 +967,15 @@ int qeth_hw_trap(struct qeth_card *, enum qeth_diags_trap_action); ...@@ -969,6 +967,15 @@ int qeth_hw_trap(struct qeth_card *, enum qeth_diags_trap_action);
int qeth_query_ipassists(struct qeth_card *, enum qeth_prot_versions prot); int qeth_query_ipassists(struct qeth_card *, enum qeth_prot_versions prot);
void qeth_trace_features(struct qeth_card *); void qeth_trace_features(struct qeth_card *);
void qeth_close_dev(struct qeth_card *); void qeth_close_dev(struct qeth_card *);
int qeth_send_simple_setassparms(struct qeth_card *, enum qeth_ipa_funcs,
__u16, long);
int qeth_send_setassparms(struct qeth_card *, struct qeth_cmd_buffer *, __u16,
long,
int (*reply_cb)(struct qeth_card *,
struct qeth_reply *, unsigned long),
void *);
int qeth_start_ipa_tx_checksum(struct qeth_card *);
int qeth_set_rx_csum(struct qeth_card *, int);
/* exports for OSN */ /* exports for OSN */
int qeth_osn_assist(struct net_device *, void *, int); int qeth_osn_assist(struct net_device *, void *, int);
......
...@@ -1982,14 +1982,6 @@ static void qeth_idx_read_cb(struct qeth_channel *channel, ...@@ -1982,14 +1982,6 @@ static void qeth_idx_read_cb(struct qeth_channel *channel,
goto out; goto out;
} }
/**
* * temporary fix for microcode bug
* * to revert it,replace OR by AND
* */
if ((!QETH_IDX_NO_PORTNAME_REQUIRED(iob->data)) ||
(card->info.type == QETH_CARD_TYPE_OSD))
card->info.portname_required = 1;
memcpy(&temp, QETH_IDX_ACT_FUNC_LEVEL(iob->data), 2); memcpy(&temp, QETH_IDX_ACT_FUNC_LEVEL(iob->data), 2);
if (temp != qeth_peer_func_level(card->info.func_level)) { if (temp != qeth_peer_func_level(card->info.func_level)) {
QETH_DBF_MESSAGE(2, "%s IDX_ACTIVATE on read channel: function " QETH_DBF_MESSAGE(2, "%s IDX_ACTIVATE on read channel: function "
...@@ -2360,8 +2352,6 @@ static int qeth_ulp_enable(struct qeth_card *card) ...@@ -2360,8 +2352,6 @@ static int qeth_ulp_enable(struct qeth_card *card)
&card->token.cm_connection_r, QETH_MPC_TOKEN_LENGTH); &card->token.cm_connection_r, QETH_MPC_TOKEN_LENGTH);
memcpy(QETH_ULP_ENABLE_FILTER_TOKEN(iob->data), memcpy(QETH_ULP_ENABLE_FILTER_TOKEN(iob->data),
&card->token.ulp_filter_w, QETH_MPC_TOKEN_LENGTH); &card->token.ulp_filter_w, QETH_MPC_TOKEN_LENGTH);
memcpy(QETH_ULP_ENABLE_PORTNAME_AND_LL(iob->data),
card->info.portname, 9);
rc = qeth_send_control_data(card, ULP_ENABLE_SIZE, iob, rc = qeth_send_control_data(card, ULP_ENABLE_SIZE, iob,
qeth_ulp_enable_cb, NULL); qeth_ulp_enable_cb, NULL);
return rc; return rc;
...@@ -2680,48 +2670,6 @@ static int qeth_mpc_initialize(struct qeth_card *card) ...@@ -2680,48 +2670,6 @@ static int qeth_mpc_initialize(struct qeth_card *card)
return rc; return rc;
} }
static void qeth_print_status_with_portname(struct qeth_card *card)
{
char dbf_text[15];
int i;
sprintf(dbf_text, "%s", card->info.portname + 1);
for (i = 0; i < 8; i++)
dbf_text[i] =
(char) _ebcasc[(__u8) dbf_text[i]];
dbf_text[8] = 0;
dev_info(&card->gdev->dev, "Device is a%s card%s%s%s\n"
"with link type %s (portname: %s)\n",
qeth_get_cardname(card),
(card->info.mcl_level[0]) ? " (level: " : "",
(card->info.mcl_level[0]) ? card->info.mcl_level : "",
(card->info.mcl_level[0]) ? ")" : "",
qeth_get_cardname_short(card),
dbf_text);
}
static void qeth_print_status_no_portname(struct qeth_card *card)
{
if (card->info.portname[0])
dev_info(&card->gdev->dev, "Device is a%s "
"card%s%s%s\nwith link type %s "
"(no portname needed by interface).\n",
qeth_get_cardname(card),
(card->info.mcl_level[0]) ? " (level: " : "",
(card->info.mcl_level[0]) ? card->info.mcl_level : "",
(card->info.mcl_level[0]) ? ")" : "",
qeth_get_cardname_short(card));
else
dev_info(&card->gdev->dev, "Device is a%s "
"card%s%s%s\nwith link type %s.\n",
qeth_get_cardname(card),
(card->info.mcl_level[0]) ? " (level: " : "",
(card->info.mcl_level[0]) ? card->info.mcl_level : "",
(card->info.mcl_level[0]) ? ")" : "",
qeth_get_cardname_short(card));
}
void qeth_print_status_message(struct qeth_card *card) void qeth_print_status_message(struct qeth_card *card)
{ {
switch (card->info.type) { switch (card->info.type) {
...@@ -2758,10 +2706,13 @@ void qeth_print_status_message(struct qeth_card *card) ...@@ -2758,10 +2706,13 @@ void qeth_print_status_message(struct qeth_card *card)
default: default:
memset(&card->info.mcl_level[0], 0, QETH_MCL_LENGTH + 1); memset(&card->info.mcl_level[0], 0, QETH_MCL_LENGTH + 1);
} }
if (card->info.portname_required) dev_info(&card->gdev->dev,
qeth_print_status_with_portname(card); "Device is a%s card%s%s%s\nwith link type %s.\n",
else qeth_get_cardname(card),
qeth_print_status_no_portname(card); (card->info.mcl_level[0]) ? " (level: " : "",
(card->info.mcl_level[0]) ? card->info.mcl_level : "",
(card->info.mcl_level[0]) ? ")" : "",
qeth_get_cardname_short(card));
} }
EXPORT_SYMBOL_GPL(qeth_print_status_message); EXPORT_SYMBOL_GPL(qeth_print_status_message);
...@@ -5027,13 +4978,11 @@ static void qeth_core_free_card(struct qeth_card *card) ...@@ -5027,13 +4978,11 @@ static void qeth_core_free_card(struct qeth_card *card)
void qeth_trace_features(struct qeth_card *card) void qeth_trace_features(struct qeth_card *card)
{ {
QETH_CARD_TEXT(card, 2, "features"); QETH_CARD_TEXT(card, 2, "features");
QETH_CARD_TEXT_(card, 2, "%x", card->options.ipa4.supported_funcs); QETH_CARD_HEX(card, 2, &card->options.ipa4, sizeof(card->options.ipa4));
QETH_CARD_TEXT_(card, 2, "%x", card->options.ipa4.enabled_funcs); QETH_CARD_HEX(card, 2, &card->options.ipa6, sizeof(card->options.ipa6));
QETH_CARD_TEXT_(card, 2, "%x", card->options.ipa6.supported_funcs); QETH_CARD_HEX(card, 2, &card->options.adp, sizeof(card->options.adp));
QETH_CARD_TEXT_(card, 2, "%x", card->options.ipa6.enabled_funcs); QETH_CARD_HEX(card, 2, &card->info.diagass_support,
QETH_CARD_TEXT_(card, 2, "%x", card->options.adp.supported_funcs); sizeof(card->info.diagass_support));
QETH_CARD_TEXT_(card, 2, "%x", card->options.adp.enabled_funcs);
QETH_CARD_TEXT_(card, 2, "%x", card->info.diagass_support);
} }
EXPORT_SYMBOL_GPL(qeth_trace_features); EXPORT_SYMBOL_GPL(qeth_trace_features);
...@@ -5132,6 +5081,7 @@ int qeth_core_hardsetup_card(struct qeth_card *card) ...@@ -5132,6 +5081,7 @@ int qeth_core_hardsetup_card(struct qeth_card *card)
} }
card->options.ipa4.supported_funcs = 0; card->options.ipa4.supported_funcs = 0;
card->options.ipa6.supported_funcs = 0;
card->options.adp.supported_funcs = 0; card->options.adp.supported_funcs = 0;
card->options.sbp.supported_funcs = 0; card->options.sbp.supported_funcs = 0;
card->info.diagass_support = 0; card->info.diagass_support = 0;
...@@ -5317,6 +5267,102 @@ struct sk_buff *qeth_core_get_next_skb(struct qeth_card *card, ...@@ -5317,6 +5267,102 @@ struct sk_buff *qeth_core_get_next_skb(struct qeth_card *card,
} }
EXPORT_SYMBOL_GPL(qeth_core_get_next_skb); EXPORT_SYMBOL_GPL(qeth_core_get_next_skb);
static int qeth_setassparms_cb(struct qeth_card *card,
struct qeth_reply *reply, unsigned long data)
{
struct qeth_ipa_cmd *cmd;
QETH_CARD_TEXT(card, 4, "defadpcb");
cmd = (struct qeth_ipa_cmd *) data;
if (cmd->hdr.return_code == 0) {
cmd->hdr.return_code = cmd->data.setassparms.hdr.return_code;
if (cmd->hdr.prot_version == QETH_PROT_IPV4)
card->options.ipa4.enabled_funcs = cmd->hdr.ipa_enabled;
if (cmd->hdr.prot_version == QETH_PROT_IPV6)
card->options.ipa6.enabled_funcs = cmd->hdr.ipa_enabled;
}
if (cmd->data.setassparms.hdr.assist_no == IPA_INBOUND_CHECKSUM &&
cmd->data.setassparms.hdr.command_code == IPA_CMD_ASS_START) {
card->info.csum_mask = cmd->data.setassparms.data.flags_32bit;
QETH_CARD_TEXT_(card, 3, "csum:%d", card->info.csum_mask);
}
if (cmd->data.setassparms.hdr.assist_no == IPA_OUTBOUND_CHECKSUM &&
cmd->data.setassparms.hdr.command_code == IPA_CMD_ASS_START) {
card->info.tx_csum_mask =
cmd->data.setassparms.data.flags_32bit;
QETH_CARD_TEXT_(card, 3, "tcsu:%d", card->info.tx_csum_mask);
}
return 0;
}
static struct qeth_cmd_buffer *qeth_get_setassparms_cmd(struct qeth_card *card,
enum qeth_ipa_funcs ipa_func,
__u16 cmd_code, __u16 len,
enum qeth_prot_versions prot)
{
struct qeth_cmd_buffer *iob;
struct qeth_ipa_cmd *cmd;
QETH_CARD_TEXT(card, 4, "getasscm");
iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETASSPARMS, prot);
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;
}
int qeth_send_setassparms(struct qeth_card *card,
struct qeth_cmd_buffer *iob, __u16 len, long data,
int (*reply_cb)(struct qeth_card *,
struct qeth_reply *, unsigned long),
void *reply_param)
{
int rc;
struct qeth_ipa_cmd *cmd;
QETH_CARD_TEXT(card, 4, "sendassp");
cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
if (len <= sizeof(__u32))
cmd->data.setassparms.data.flags_32bit = (__u32) data;
else /* (len > sizeof(__u32)) */
memcpy(&cmd->data.setassparms.data, (void *) data, len);
rc = qeth_send_ipa_cmd(card, iob, reply_cb, reply_param);
return rc;
}
EXPORT_SYMBOL_GPL(qeth_send_setassparms);
int qeth_send_simple_setassparms(struct qeth_card *card,
enum qeth_ipa_funcs ipa_func,
__u16 cmd_code, long data)
{
int rc;
int length = 0;
struct qeth_cmd_buffer *iob;
QETH_CARD_TEXT(card, 4, "simassp4");
if (data)
length = sizeof(__u32);
iob = qeth_get_setassparms_cmd(card, ipa_func, cmd_code,
length, QETH_PROT_IPV4);
if (!iob)
return -ENOMEM;
rc = qeth_send_setassparms(card, iob, length, data,
qeth_setassparms_cb, NULL);
return rc;
}
EXPORT_SYMBOL_GPL(qeth_send_simple_setassparms);
static void qeth_unregister_dbf_views(void) static void qeth_unregister_dbf_views(void)
{ {
int x; int x;
...@@ -6003,6 +6049,75 @@ int qeth_core_ethtool_get_settings(struct net_device *netdev, ...@@ -6003,6 +6049,75 @@ int qeth_core_ethtool_get_settings(struct net_device *netdev,
} }
EXPORT_SYMBOL_GPL(qeth_core_ethtool_get_settings); EXPORT_SYMBOL_GPL(qeth_core_ethtool_get_settings);
static int qeth_send_checksum_command(struct qeth_card *card)
{
int rc;
rc = qeth_send_simple_setassparms(card, IPA_INBOUND_CHECKSUM,
IPA_CMD_ASS_START, 0);
if (rc) {
dev_warn(&card->gdev->dev, "Starting HW checksumming for %s "
"failed, using SW checksumming\n",
QETH_CARD_IFNAME(card));
return rc;
}
rc = qeth_send_simple_setassparms(card, IPA_INBOUND_CHECKSUM,
IPA_CMD_ASS_ENABLE,
card->info.csum_mask);
if (rc) {
dev_warn(&card->gdev->dev, "Enabling HW checksumming for %s "
"failed, using SW checksumming\n",
QETH_CARD_IFNAME(card));
return rc;
}
return 0;
}
int qeth_set_rx_csum(struct qeth_card *card, int on)
{
int rc;
if (on) {
rc = qeth_send_checksum_command(card);
if (rc)
return -EIO;
dev_info(&card->gdev->dev,
"HW Checksumming (inbound) enabled\n");
} else {
rc = qeth_send_simple_setassparms(card,
IPA_INBOUND_CHECKSUM, IPA_CMD_ASS_STOP, 0);
if (rc)
return -EIO;
}
return 0;
}
EXPORT_SYMBOL_GPL(qeth_set_rx_csum);
int qeth_start_ipa_tx_checksum(struct qeth_card *card)
{
int rc = 0;
if (!qeth_is_supported(card, IPA_OUTBOUND_CHECKSUM))
return rc;
rc = qeth_send_simple_setassparms(card, IPA_OUTBOUND_CHECKSUM,
IPA_CMD_ASS_START, 0);
if (rc)
goto err_out;
rc = qeth_send_simple_setassparms(card, IPA_OUTBOUND_CHECKSUM,
IPA_CMD_ASS_ENABLE,
card->info.tx_csum_mask);
if (rc)
goto err_out;
dev_info(&card->gdev->dev, "HW TX Checksumming enabled\n");
return rc;
err_out:
dev_warn(&card->gdev->dev, "Enabling HW TX checksumming for %s "
"failed, using SW TX checksumming\n", QETH_CARD_IFNAME(card));
return rc;
}
EXPORT_SYMBOL_GPL(qeth_start_ipa_tx_checksum);
static int __init qeth_core_init(void) static int __init qeth_core_init(void)
{ {
int rc; int rc;
......
...@@ -153,52 +153,17 @@ static DEVICE_ATTR(portno, 0644, qeth_dev_portno_show, qeth_dev_portno_store); ...@@ -153,52 +153,17 @@ static DEVICE_ATTR(portno, 0644, qeth_dev_portno_show, qeth_dev_portno_store);
static ssize_t qeth_dev_portname_show(struct device *dev, static ssize_t qeth_dev_portname_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct qeth_card *card = dev_get_drvdata(dev); return sprintf(buf, "no portname required\n");
char portname[9] = {0, };
if (!card)
return -EINVAL;
if (card->info.portname_required) {
memcpy(portname, card->info.portname + 1, 8);
EBCASC(portname, 8);
return sprintf(buf, "%s\n", portname);
} else
return sprintf(buf, "no portname required\n");
} }
static ssize_t qeth_dev_portname_store(struct device *dev, static ssize_t qeth_dev_portname_store(struct device *dev,
struct device_attribute *attr, const char *buf, size_t count) struct device_attribute *attr, const char *buf, size_t count)
{ {
struct qeth_card *card = dev_get_drvdata(dev); struct qeth_card *card = dev_get_drvdata(dev);
char *tmp;
int i, rc = 0;
if (!card)
return -EINVAL;
mutex_lock(&card->conf_mutex);
if ((card->state != CARD_STATE_DOWN) &&
(card->state != CARD_STATE_RECOVER)) {
rc = -EPERM;
goto out;
}
tmp = strsep((char **) &buf, "\n"); dev_warn_once(&card->gdev->dev,
if ((strlen(tmp) > 8) || (strlen(tmp) == 0)) { "portname is deprecated and is ignored\n");
rc = -EINVAL; return count;
goto out;
}
card->info.portname[0] = strlen(tmp);
/* for beauty reasons */
for (i = 1; i < 9; i++)
card->info.portname[i] = ' ';
strcpy(card->info.portname + 1, tmp);
ASCEBC(card->info.portname + 1, 8);
out:
mutex_unlock(&card->conf_mutex);
return rc ? rc : count;
} }
static DEVICE_ATTR(portname, 0644, qeth_dev_portname_show, static DEVICE_ATTR(portname, 0644, qeth_dev_portname_show,
......
...@@ -252,6 +252,23 @@ static inline int qeth_l2_get_cast_type(struct qeth_card *card, ...@@ -252,6 +252,23 @@ static inline int qeth_l2_get_cast_type(struct qeth_card *card,
return RTN_UNSPEC; return RTN_UNSPEC;
} }
static inline void qeth_l2_hdr_csum(struct qeth_card *card,
struct qeth_hdr *hdr, struct sk_buff *skb)
{
struct iphdr *iph = ip_hdr(skb);
/* tcph->check contains already the pseudo hdr checksum
* so just set the header flags
*/
if (iph->protocol == IPPROTO_UDP)
hdr->hdr.l2.flags[1] |= QETH_HDR_EXT_UDP;
hdr->hdr.l2.flags[1] |= QETH_HDR_EXT_CSUM_TRANSP_REQ |
QETH_HDR_EXT_CSUM_HDR_REQ;
iph->check = 0;
if (card->options.performance_stats)
card->perf_stats.tx_csum++;
}
static void qeth_l2_fill_header(struct qeth_card *card, struct qeth_hdr *hdr, static void qeth_l2_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
struct sk_buff *skb, int cast_type) struct sk_buff *skb, int cast_type)
{ {
...@@ -390,6 +407,38 @@ static int qeth_l2_vlan_rx_kill_vid(struct net_device *dev, ...@@ -390,6 +407,38 @@ static int qeth_l2_vlan_rx_kill_vid(struct net_device *dev,
return rc; return rc;
} }
static netdev_features_t qeth_l2_fix_features(struct net_device *dev,
netdev_features_t features)
{
struct qeth_card *card = dev->ml_priv;
QETH_DBF_TEXT(SETUP, 2, "fixfeat");
if (!qeth_is_supported(card, IPA_OUTBOUND_CHECKSUM))
features &= ~NETIF_F_IP_CSUM;
if (!qeth_is_supported(card, IPA_INBOUND_CHECKSUM))
features &= ~NETIF_F_RXCSUM;
QETH_DBF_HEX(SETUP, 2, &features, sizeof(features));
return features;
}
static int qeth_l2_set_features(struct net_device *dev,
netdev_features_t features)
{
struct qeth_card *card = dev->ml_priv;
netdev_features_t changed = dev->features ^ features;
QETH_DBF_TEXT(SETUP, 2, "setfeat");
QETH_DBF_HEX(SETUP, 2, &features, sizeof(features));
if (card->state == CARD_STATE_DOWN ||
card->state == CARD_STATE_RECOVER)
return 0;
if (!(changed & NETIF_F_RXCSUM))
return 0;
return qeth_set_rx_csum(card, features & NETIF_F_RXCSUM ? 1 : 0);
}
static void qeth_l2_stop_card(struct qeth_card *card, int recovery_mode) static void qeth_l2_stop_card(struct qeth_card *card, int recovery_mode)
{ {
QETH_DBF_TEXT(SETUP , 2, "stopcard"); QETH_DBF_TEXT(SETUP , 2, "stopcard");
...@@ -450,7 +499,15 @@ static int qeth_l2_process_inbound_buffer(struct qeth_card *card, ...@@ -450,7 +499,15 @@ static int qeth_l2_process_inbound_buffer(struct qeth_card *card,
case QETH_HEADER_TYPE_LAYER2: case QETH_HEADER_TYPE_LAYER2:
skb->pkt_type = PACKET_HOST; skb->pkt_type = PACKET_HOST;
skb->protocol = eth_type_trans(skb, skb->dev); skb->protocol = eth_type_trans(skb, skb->dev);
skb->ip_summed = CHECKSUM_NONE; if ((card->dev->features & NETIF_F_RXCSUM)
&& ((hdr->hdr.l2.flags[1] &
(QETH_HDR_EXT_CSUM_HDR_REQ |
QETH_HDR_EXT_CSUM_TRANSP_REQ)) ==
(QETH_HDR_EXT_CSUM_HDR_REQ |
QETH_HDR_EXT_CSUM_TRANSP_REQ)))
skb->ip_summed = CHECKSUM_UNNECESSARY;
else
skb->ip_summed = CHECKSUM_NONE;
if (skb->protocol == htons(ETH_P_802_2)) if (skb->protocol == htons(ETH_P_802_2))
*((__u32 *)skb->cb) = ++card->seqno.pkt_seqno; *((__u32 *)skb->cb) = ++card->seqno.pkt_seqno;
len = skb->len; len = skb->len;
...@@ -803,6 +860,8 @@ static int qeth_l2_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -803,6 +860,8 @@ static int qeth_l2_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
sizeof(struct qeth_hdr)); sizeof(struct qeth_hdr));
skb_set_mac_header(new_skb, sizeof(struct qeth_hdr)); skb_set_mac_header(new_skb, sizeof(struct qeth_hdr));
qeth_l2_fill_header(card, hdr, new_skb, cast_type); qeth_l2_fill_header(card, hdr, new_skb, cast_type);
if (new_skb->ip_summed == CHECKSUM_PARTIAL)
qeth_l2_hdr_csum(card, hdr, new_skb);
} }
} }
...@@ -968,6 +1027,8 @@ static const struct net_device_ops qeth_l2_netdev_ops = { ...@@ -968,6 +1027,8 @@ static const struct net_device_ops qeth_l2_netdev_ops = {
.ndo_vlan_rx_add_vid = qeth_l2_vlan_rx_add_vid, .ndo_vlan_rx_add_vid = qeth_l2_vlan_rx_add_vid,
.ndo_vlan_rx_kill_vid = qeth_l2_vlan_rx_kill_vid, .ndo_vlan_rx_kill_vid = qeth_l2_vlan_rx_kill_vid,
.ndo_tx_timeout = qeth_tx_timeout, .ndo_tx_timeout = qeth_tx_timeout,
.ndo_fix_features = qeth_l2_fix_features,
.ndo_set_features = qeth_l2_set_features
}; };
static int qeth_l2_setup_netdev(struct qeth_card *card) static int qeth_l2_setup_netdev(struct qeth_card *card)
...@@ -997,6 +1058,11 @@ static int qeth_l2_setup_netdev(struct qeth_card *card) ...@@ -997,6 +1058,11 @@ static int qeth_l2_setup_netdev(struct qeth_card *card)
(card->info.type != QETH_CARD_TYPE_OSN) ? (card->info.type != QETH_CARD_TYPE_OSN) ?
&qeth_l2_ethtool_ops : &qeth_l2_osn_ops; &qeth_l2_ethtool_ops : &qeth_l2_osn_ops;
card->dev->features |= NETIF_F_HW_VLAN_CTAG_FILTER; card->dev->features |= NETIF_F_HW_VLAN_CTAG_FILTER;
if (card->info.type == QETH_CARD_TYPE_OSD && !card->info.guestlan) {
card->dev->hw_features = NETIF_F_IP_CSUM | NETIF_F_RXCSUM;
/* Turn on RX offloading per default */
card->dev->features |= NETIF_F_RXCSUM;
}
card->info.broadcast_capable = 1; card->info.broadcast_capable = 1;
qeth_l2_request_initial_mac(card); qeth_l2_request_initial_mac(card);
SET_NETDEV_DEV(card->dev, &card->gdev->dev); SET_NETDEV_DEV(card->dev, &card->gdev->dev);
...@@ -1004,6 +1070,17 @@ static int qeth_l2_setup_netdev(struct qeth_card *card) ...@@ -1004,6 +1070,17 @@ static int qeth_l2_setup_netdev(struct qeth_card *card)
return register_netdev(card->dev); return register_netdev(card->dev);
} }
static int qeth_l2_start_ipassists(struct qeth_card *card)
{
/* configure isolation level */
if (qeth_set_access_ctrl_online(card, 0))
return -ENODEV;
if (qeth_is_supported(card, IPA_INBOUND_CHECKSUM))
qeth_set_rx_csum(card, 1);
qeth_start_ipa_tx_checksum(card);
return 0;
}
static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode) static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode)
{ {
struct qeth_card *card = dev_get_drvdata(&gdev->dev); struct qeth_card *card = dev_get_drvdata(&gdev->dev);
...@@ -1069,12 +1146,8 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode) ...@@ -1069,12 +1146,8 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode)
contin: contin:
if ((card->info.type == QETH_CARD_TYPE_OSD) || if ((card->info.type == QETH_CARD_TYPE_OSD) ||
(card->info.type == QETH_CARD_TYPE_OSX)) { (card->info.type == QETH_CARD_TYPE_OSX)) {
/* configure isolation level */ if (qeth_l2_start_ipassists(card))
rc = qeth_set_access_ctrl_online(card, 0);
if (rc) {
rc = -ENODEV;
goto out_remove; goto out_remove;
}
} }
if (card->info.type != QETH_CARD_TYPE_OSN && if (card->info.type != QETH_CARD_TYPE_OSN &&
...@@ -1452,8 +1525,8 @@ static void qeth_bridge_emit_host_event(struct qeth_card *card, ...@@ -1452,8 +1525,8 @@ static void qeth_bridge_emit_host_event(struct qeth_card *card,
env[i] = str[i]; i++; env[i] = str[i]; i++;
} }
if (code & IPA_ADDR_CHANGE_CODE_MACADDR) { if (code & IPA_ADDR_CHANGE_CODE_MACADDR) {
snprintf(str[i], sizeof(str[i]), "MAC=%pM6", snprintf(str[i], sizeof(str[i]), "MAC=%pM",
&addr_lnid->mac); addr_lnid->mac);
env[i] = str[i]; i++; env[i] = str[i]; i++;
} }
snprintf(str[i], sizeof(str[i]), "NTOK_BUSID=%x.%x.%04x", snprintf(str[i], sizeof(str[i]), "NTOK_BUSID=%x.%x.%04x",
......
...@@ -109,7 +109,7 @@ static ssize_t qeth_bridge_port_state_show(struct device *dev, ...@@ -109,7 +109,7 @@ static ssize_t qeth_bridge_port_state_show(struct device *dev,
return qeth_bridge_port_role_state_show(dev, attr, buf, 1); return qeth_bridge_port_role_state_show(dev, attr, buf, 1);
} }
static DEVICE_ATTR(bridge_state, 0644, qeth_bridge_port_state_show, static DEVICE_ATTR(bridge_state, 0444, qeth_bridge_port_state_show,
NULL); NULL);
static ssize_t qeth_bridgeport_hostnotification_show(struct device *dev, static ssize_t qeth_bridgeport_hostnotification_show(struct device *dev,
......
...@@ -1065,27 +1065,6 @@ static struct qeth_cmd_buffer *qeth_l3_get_setassparms_cmd( ...@@ -1065,27 +1065,6 @@ static struct qeth_cmd_buffer *qeth_l3_get_setassparms_cmd(
return iob; return iob;
} }
static int qeth_l3_send_setassparms(struct qeth_card *card,
struct qeth_cmd_buffer *iob, __u16 len, long data,
int (*reply_cb)(struct qeth_card *, struct qeth_reply *,
unsigned long),
void *reply_param)
{
int rc;
struct qeth_ipa_cmd *cmd;
QETH_CARD_TEXT(card, 4, "sendassp");
cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
if (len <= sizeof(__u32))
cmd->data.setassparms.data.flags_32bit = (__u32) data;
else /* (len > sizeof(__u32)) */
memcpy(&cmd->data.setassparms.data, (void *) data, len);
rc = qeth_send_ipa_cmd(card, iob, reply_cb, reply_param);
return rc;
}
#ifdef CONFIG_QETH_IPV6 #ifdef CONFIG_QETH_IPV6
static int qeth_l3_send_simple_setassparms_ipv6(struct qeth_card *card, static int qeth_l3_send_simple_setassparms_ipv6(struct qeth_card *card,
enum qeth_ipa_funcs ipa_func, __u16 cmd_code) enum qeth_ipa_funcs ipa_func, __u16 cmd_code)
...@@ -1098,31 +1077,12 @@ static int qeth_l3_send_simple_setassparms_ipv6(struct qeth_card *card, ...@@ -1098,31 +1077,12 @@ static int qeth_l3_send_simple_setassparms_ipv6(struct qeth_card *card,
0, QETH_PROT_IPV6); 0, QETH_PROT_IPV6);
if (!iob) if (!iob)
return -ENOMEM; return -ENOMEM;
rc = qeth_l3_send_setassparms(card, iob, 0, 0, rc = qeth_send_setassparms(card, iob, 0, 0,
qeth_l3_default_setassparms_cb, NULL); qeth_l3_default_setassparms_cb, NULL);
return rc; return rc;
} }
#endif #endif
static int qeth_l3_send_simple_setassparms(struct qeth_card *card,
enum qeth_ipa_funcs ipa_func, __u16 cmd_code, long data)
{
int rc;
int length = 0;
struct qeth_cmd_buffer *iob;
QETH_CARD_TEXT(card, 4, "simassp4");
if (data)
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;
}
static int qeth_l3_start_ipa_arp_processing(struct qeth_card *card) static int qeth_l3_start_ipa_arp_processing(struct qeth_card *card)
{ {
int rc; int rc;
...@@ -1135,8 +1095,8 @@ static int qeth_l3_start_ipa_arp_processing(struct qeth_card *card) ...@@ -1135,8 +1095,8 @@ static int qeth_l3_start_ipa_arp_processing(struct qeth_card *card)
QETH_CARD_IFNAME(card)); QETH_CARD_IFNAME(card));
return 0; return 0;
} }
rc = qeth_l3_send_simple_setassparms(card, IPA_ARP_PROCESSING, rc = qeth_send_simple_setassparms(card, IPA_ARP_PROCESSING,
IPA_CMD_ASS_START, 0); IPA_CMD_ASS_START, 0);
if (rc) { if (rc) {
dev_warn(&card->gdev->dev, dev_warn(&card->gdev->dev,
"Starting ARP processing support for %s failed\n", "Starting ARP processing support for %s failed\n",
...@@ -1158,7 +1118,7 @@ static int qeth_l3_start_ipa_ip_fragmentation(struct qeth_card *card) ...@@ -1158,7 +1118,7 @@ static int qeth_l3_start_ipa_ip_fragmentation(struct qeth_card *card)
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
rc = qeth_l3_send_simple_setassparms(card, IPA_IP_FRAGMENTATION, rc = qeth_send_simple_setassparms(card, IPA_IP_FRAGMENTATION,
IPA_CMD_ASS_START, 0); IPA_CMD_ASS_START, 0);
if (rc) { if (rc) {
dev_warn(&card->gdev->dev, dev_warn(&card->gdev->dev,
...@@ -1183,7 +1143,7 @@ static int qeth_l3_start_ipa_source_mac(struct qeth_card *card) ...@@ -1183,7 +1143,7 @@ static int qeth_l3_start_ipa_source_mac(struct qeth_card *card)
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
rc = qeth_l3_send_simple_setassparms(card, IPA_SOURCE_MAC, rc = qeth_send_simple_setassparms(card, IPA_SOURCE_MAC,
IPA_CMD_ASS_START, 0); IPA_CMD_ASS_START, 0);
if (rc) if (rc)
dev_warn(&card->gdev->dev, dev_warn(&card->gdev->dev,
...@@ -1204,7 +1164,7 @@ static int qeth_l3_start_ipa_vlan(struct qeth_card *card) ...@@ -1204,7 +1164,7 @@ static int qeth_l3_start_ipa_vlan(struct qeth_card *card)
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
rc = qeth_l3_send_simple_setassparms(card, IPA_VLAN_PRIO, rc = qeth_send_simple_setassparms(card, IPA_VLAN_PRIO,
IPA_CMD_ASS_START, 0); IPA_CMD_ASS_START, 0);
if (rc) { if (rc) {
dev_warn(&card->gdev->dev, dev_warn(&card->gdev->dev,
...@@ -1229,7 +1189,7 @@ static int qeth_l3_start_ipa_multicast(struct qeth_card *card) ...@@ -1229,7 +1189,7 @@ static int qeth_l3_start_ipa_multicast(struct qeth_card *card)
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
rc = qeth_l3_send_simple_setassparms(card, IPA_MULTICASTING, rc = qeth_send_simple_setassparms(card, IPA_MULTICASTING,
IPA_CMD_ASS_START, 0); IPA_CMD_ASS_START, 0);
if (rc) { if (rc) {
dev_warn(&card->gdev->dev, dev_warn(&card->gdev->dev,
...@@ -1259,7 +1219,7 @@ static int qeth_l3_softsetup_ipv6(struct qeth_card *card) ...@@ -1259,7 +1219,7 @@ static int qeth_l3_softsetup_ipv6(struct qeth_card *card)
QETH_CARD_IFNAME(card)); QETH_CARD_IFNAME(card));
return rc; return rc;
} }
rc = qeth_l3_send_simple_setassparms(card, IPA_IPV6, rc = qeth_send_simple_setassparms(card, IPA_IPV6,
IPA_CMD_ASS_START, 3); IPA_CMD_ASS_START, 3);
if (rc) { if (rc) {
dev_err(&card->gdev->dev, dev_err(&card->gdev->dev,
...@@ -1319,7 +1279,7 @@ static int qeth_l3_start_ipa_broadcast(struct qeth_card *card) ...@@ -1319,7 +1279,7 @@ static int qeth_l3_start_ipa_broadcast(struct qeth_card *card)
rc = -EOPNOTSUPP; rc = -EOPNOTSUPP;
goto out; goto out;
} }
rc = qeth_l3_send_simple_setassparms(card, IPA_FILTERING, rc = qeth_send_simple_setassparms(card, IPA_FILTERING,
IPA_CMD_ASS_START, 0); IPA_CMD_ASS_START, 0);
if (rc) { if (rc) {
dev_warn(&card->gdev->dev, "Enabling broadcast filtering for " dev_warn(&card->gdev->dev, "Enabling broadcast filtering for "
...@@ -1327,7 +1287,7 @@ static int qeth_l3_start_ipa_broadcast(struct qeth_card *card) ...@@ -1327,7 +1287,7 @@ static int qeth_l3_start_ipa_broadcast(struct qeth_card *card)
goto out; goto out;
} }
rc = qeth_l3_send_simple_setassparms(card, IPA_FILTERING, rc = qeth_send_simple_setassparms(card, IPA_FILTERING,
IPA_CMD_ASS_CONFIGURE, 1); IPA_CMD_ASS_CONFIGURE, 1);
if (rc) { if (rc) {
dev_warn(&card->gdev->dev, dev_warn(&card->gdev->dev,
...@@ -1337,7 +1297,7 @@ static int qeth_l3_start_ipa_broadcast(struct qeth_card *card) ...@@ -1337,7 +1297,7 @@ static int qeth_l3_start_ipa_broadcast(struct qeth_card *card)
} }
card->info.broadcast_capable = QETH_BROADCAST_WITH_ECHO; card->info.broadcast_capable = QETH_BROADCAST_WITH_ECHO;
dev_info(&card->gdev->dev, "Broadcast enabled\n"); dev_info(&card->gdev->dev, "Broadcast enabled\n");
rc = qeth_l3_send_simple_setassparms(card, IPA_FILTERING, rc = qeth_send_simple_setassparms(card, IPA_FILTERING,
IPA_CMD_ASS_ENABLE, 1); IPA_CMD_ASS_ENABLE, 1);
if (rc) { if (rc) {
dev_warn(&card->gdev->dev, "Setting up broadcast echo " dev_warn(&card->gdev->dev, "Setting up broadcast echo "
...@@ -1353,84 +1313,18 @@ static int qeth_l3_start_ipa_broadcast(struct qeth_card *card) ...@@ -1353,84 +1313,18 @@ static int qeth_l3_start_ipa_broadcast(struct qeth_card *card)
return rc; return rc;
} }
static int qeth_l3_send_checksum_command(struct qeth_card *card) static void qeth_l3_start_ipa_checksum(struct qeth_card *card)
{
int rc;
rc = qeth_l3_send_simple_setassparms(card, IPA_INBOUND_CHECKSUM,
IPA_CMD_ASS_START, 0);
if (rc) {
dev_warn(&card->gdev->dev, "Starting HW checksumming for %s "
"failed, using SW checksumming\n",
QETH_CARD_IFNAME(card));
return rc;
}
rc = qeth_l3_send_simple_setassparms(card, IPA_INBOUND_CHECKSUM,
IPA_CMD_ASS_ENABLE,
card->info.csum_mask);
if (rc) {
dev_warn(&card->gdev->dev, "Enabling HW checksumming for %s "
"failed, using SW checksumming\n",
QETH_CARD_IFNAME(card));
return rc;
}
return 0;
}
static int qeth_l3_set_rx_csum(struct qeth_card *card, int on)
{
int rc = 0;
if (on) {
rc = qeth_l3_send_checksum_command(card);
if (rc)
return -EIO;
dev_info(&card->gdev->dev,
"HW Checksumming (inbound) enabled\n");
} else {
rc = qeth_l3_send_simple_setassparms(card,
IPA_INBOUND_CHECKSUM, IPA_CMD_ASS_STOP, 0);
if (rc)
return -EIO;
}
return 0;
}
static int qeth_l3_start_ipa_checksum(struct qeth_card *card)
{ {
QETH_CARD_TEXT(card, 3, "strtcsum"); QETH_CARD_TEXT(card, 3, "strtcsum");
if (qeth_is_supported(card, IPA_INBOUND_CHECKSUM)
if (card->dev->features & NETIF_F_RXCSUM) { && (card->dev->features & NETIF_F_RXCSUM))
rtnl_lock(); qeth_set_rx_csum(card, 1);
/* force set_features call */
card->dev->features &= ~NETIF_F_RXCSUM;
netdev_update_features(card->dev);
rtnl_unlock();
}
return 0;
} }
static int qeth_l3_start_ipa_tx_checksum(struct qeth_card *card) static void qeth_l3_start_ipa_tx_checksum(struct qeth_card *card)
{ {
int rc = 0; QETH_CARD_TEXT(card, 3, "strttxcs");
qeth_start_ipa_tx_checksum(card);
if (!qeth_is_supported(card, IPA_OUTBOUND_CHECKSUM))
return rc;
rc = qeth_l3_send_simple_setassparms(card, IPA_OUTBOUND_CHECKSUM,
IPA_CMD_ASS_START, 0);
if (rc)
goto err_out;
rc = qeth_l3_send_simple_setassparms(card, IPA_OUTBOUND_CHECKSUM,
IPA_CMD_ASS_ENABLE, card->info.tx_csum_mask);
if (rc)
goto err_out;
dev_info(&card->gdev->dev, "HW TX Checksumming enabled\n");
return rc;
err_out:
dev_warn(&card->gdev->dev, "Enabling HW TX checksumming for %s "
"failed, using SW TX checksumming\n", QETH_CARD_IFNAME(card));
return rc;
} }
static int qeth_l3_start_ipa_tso(struct qeth_card *card) static int qeth_l3_start_ipa_tso(struct qeth_card *card)
...@@ -1445,8 +1339,8 @@ static int qeth_l3_start_ipa_tso(struct qeth_card *card) ...@@ -1445,8 +1339,8 @@ static int qeth_l3_start_ipa_tso(struct qeth_card *card)
QETH_CARD_IFNAME(card)); QETH_CARD_IFNAME(card));
rc = -EOPNOTSUPP; rc = -EOPNOTSUPP;
} else { } else {
rc = qeth_l3_send_simple_setassparms(card, IPA_OUTBOUND_TSO, rc = qeth_send_simple_setassparms(card, IPA_OUTBOUND_TSO,
IPA_CMD_ASS_START, 0); IPA_CMD_ASS_START, 0);
if (rc) if (rc)
dev_warn(&card->gdev->dev, "Starting outbound TCP " dev_warn(&card->gdev->dev, "Starting outbound TCP "
"segmentation offload for %s failed\n", "segmentation offload for %s failed\n",
...@@ -1950,7 +1844,6 @@ static inline int qeth_l3_rebuild_skb(struct qeth_card *card, ...@@ -1950,7 +1844,6 @@ static inline int qeth_l3_rebuild_skb(struct qeth_card *card,
skb->ip_summed = CHECKSUM_NONE; skb->ip_summed = CHECKSUM_NONE;
} else } else
skb->ip_summed = CHECKSUM_NONE; skb->ip_summed = CHECKSUM_NONE;
return is_vlan; return is_vlan;
} }
...@@ -2287,7 +2180,7 @@ static int qeth_l3_arp_set_no_entries(struct qeth_card *card, int no_entries) ...@@ -2287,7 +2180,7 @@ static int qeth_l3_arp_set_no_entries(struct qeth_card *card, int no_entries)
if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) { if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) {
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
rc = qeth_l3_send_simple_setassparms(card, IPA_ARP_PROCESSING, rc = qeth_send_simple_setassparms(card, IPA_ARP_PROCESSING,
IPA_CMD_ASS_ARP_SET_NO_ENTRIES, IPA_CMD_ASS_ARP_SET_NO_ENTRIES,
no_entries); no_entries);
if (rc) { if (rc) {
...@@ -2552,7 +2445,7 @@ static int qeth_l3_arp_add_entry(struct qeth_card *card, ...@@ -2552,7 +2445,7 @@ static int qeth_l3_arp_add_entry(struct qeth_card *card,
QETH_PROT_IPV4); QETH_PROT_IPV4);
if (!iob) if (!iob)
return -ENOMEM; return -ENOMEM;
rc = qeth_l3_send_setassparms(card, iob, rc = qeth_send_setassparms(card, iob,
sizeof(struct qeth_arp_cache_entry), sizeof(struct qeth_arp_cache_entry),
(unsigned long) entry, (unsigned long) entry,
qeth_l3_default_setassparms_cb, NULL); qeth_l3_default_setassparms_cb, NULL);
...@@ -2593,7 +2486,7 @@ static int qeth_l3_arp_remove_entry(struct qeth_card *card, ...@@ -2593,7 +2486,7 @@ static int qeth_l3_arp_remove_entry(struct qeth_card *card,
QETH_PROT_IPV4); QETH_PROT_IPV4);
if (!iob) if (!iob)
return -ENOMEM; return -ENOMEM;
rc = qeth_l3_send_setassparms(card, iob, rc = qeth_send_setassparms(card, iob,
12, (unsigned long)buf, 12, (unsigned long)buf,
qeth_l3_default_setassparms_cb, NULL); qeth_l3_default_setassparms_cb, NULL);
if (rc) { if (rc) {
...@@ -2624,7 +2517,7 @@ static int qeth_l3_arp_flush_cache(struct qeth_card *card) ...@@ -2624,7 +2517,7 @@ static int qeth_l3_arp_flush_cache(struct qeth_card *card)
if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) { if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) {
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
rc = qeth_l3_send_simple_setassparms(card, IPA_ARP_PROCESSING, rc = qeth_send_simple_setassparms(card, IPA_ARP_PROCESSING,
IPA_CMD_ASS_ARP_FLUSH_CACHE, 0); IPA_CMD_ASS_ARP_FLUSH_CACHE, 0);
if (rc) { if (rc) {
tmp = rc; tmp = rc;
...@@ -3187,7 +3080,6 @@ static netdev_features_t qeth_l3_fix_features(struct net_device *dev, ...@@ -3187,7 +3080,6 @@ static netdev_features_t qeth_l3_fix_features(struct net_device *dev,
features &= ~NETIF_F_TSO; features &= ~NETIF_F_TSO;
if (!qeth_is_supported(card, IPA_INBOUND_CHECKSUM)) if (!qeth_is_supported(card, IPA_INBOUND_CHECKSUM))
features &= ~NETIF_F_RXCSUM; features &= ~NETIF_F_RXCSUM;
return features; return features;
} }
...@@ -3204,7 +3096,7 @@ static int qeth_l3_set_features(struct net_device *dev, ...@@ -3204,7 +3096,7 @@ static int qeth_l3_set_features(struct net_device *dev,
card->state == CARD_STATE_RECOVER) card->state == CARD_STATE_RECOVER)
return 0; return 0;
return qeth_l3_set_rx_csum(card, features & NETIF_F_RXCSUM ? 1 : 0); return qeth_set_rx_csum(card, features & NETIF_F_RXCSUM ? 1 : 0);
} }
static const struct ethtool_ops qeth_l3_ethtool_ops = { static const struct ethtool_ops qeth_l3_ethtool_ops = {
......
...@@ -49,7 +49,7 @@ static DEFINE_SPINLOCK(smsg_list_lock); ...@@ -49,7 +49,7 @@ static DEFINE_SPINLOCK(smsg_list_lock);
static LIST_HEAD(smsg_list); static LIST_HEAD(smsg_list);
static int iucv_path_connected; static int iucv_path_connected;
static int smsg_path_pending(struct iucv_path *, u8 ipvmid[8], u8 ipuser[16]); static int smsg_path_pending(struct iucv_path *, u8 *, u8 *);
static void smsg_message_pending(struct iucv_path *, struct iucv_message *); static void smsg_message_pending(struct iucv_path *, struct iucv_message *);
static struct iucv_handler smsg_handler = { static struct iucv_handler smsg_handler = {
...@@ -57,8 +57,7 @@ static struct iucv_handler smsg_handler = { ...@@ -57,8 +57,7 @@ static struct iucv_handler smsg_handler = {
.message_pending = smsg_message_pending, .message_pending = smsg_message_pending,
}; };
static int smsg_path_pending(struct iucv_path *path, u8 ipvmid[8], static int smsg_path_pending(struct iucv_path *path, u8 *ipvmid, u8 *ipuser)
u8 ipuser[16])
{ {
if (strncmp(ipvmid, "*MSG ", 8) != 0) if (strncmp(ipvmid, "*MSG ", 8) != 0)
return -EINVAL; return -EINVAL;
......
...@@ -88,8 +88,8 @@ struct iucv_tty_buffer { ...@@ -88,8 +88,8 @@ struct iucv_tty_buffer {
}; };
/* IUCV callback handler */ /* IUCV callback handler */
static int hvc_iucv_path_pending(struct iucv_path *, u8[8], u8[16]); static int hvc_iucv_path_pending(struct iucv_path *, u8 *, u8 *);
static void hvc_iucv_path_severed(struct iucv_path *, u8[16]); static void hvc_iucv_path_severed(struct iucv_path *, u8 *);
static void hvc_iucv_msg_pending(struct iucv_path *, struct iucv_message *); static void hvc_iucv_msg_pending(struct iucv_path *, struct iucv_message *);
static void hvc_iucv_msg_complete(struct iucv_path *, struct iucv_message *); static void hvc_iucv_msg_complete(struct iucv_path *, struct iucv_message *);
...@@ -782,8 +782,8 @@ static int hvc_iucv_filter_connreq(u8 ipvmid[8]) ...@@ -782,8 +782,8 @@ static int hvc_iucv_filter_connreq(u8 ipvmid[8])
* *
* Locking: struct hvc_iucv_private->lock * Locking: struct hvc_iucv_private->lock
*/ */
static int hvc_iucv_path_pending(struct iucv_path *path, static int hvc_iucv_path_pending(struct iucv_path *path, u8 *ipvmid,
u8 ipvmid[8], u8 ipuser[16]) u8 *ipuser)
{ {
struct hvc_iucv_private *priv, *tmp; struct hvc_iucv_private *priv, *tmp;
u8 wildcard[9] = "lnxhvc "; u8 wildcard[9] = "lnxhvc ";
...@@ -881,7 +881,7 @@ static int hvc_iucv_path_pending(struct iucv_path *path, ...@@ -881,7 +881,7 @@ static int hvc_iucv_path_pending(struct iucv_path *path,
* *
* Locking: struct hvc_iucv_private->lock * Locking: struct hvc_iucv_private->lock
*/ */
static void hvc_iucv_path_severed(struct iucv_path *path, u8 ipuser[16]) static void hvc_iucv_path_severed(struct iucv_path *path, u8 *ipuser)
{ {
struct hvc_iucv_private *priv = path->private; struct hvc_iucv_private *priv = path->private;
......
...@@ -141,14 +141,14 @@ struct iucv_handler { ...@@ -141,14 +141,14 @@ struct iucv_handler {
* called is the order of the registration of the iucv handlers * called is the order of the registration of the iucv handlers
* to the base code. * to the base code.
*/ */
int (*path_pending)(struct iucv_path *, u8 ipvmid[8], u8 ipuser[16]); int (*path_pending)(struct iucv_path *, u8 *ipvmid, u8 *ipuser);
/* /*
* The path_complete function is called after an iucv interrupt * The path_complete function is called after an iucv interrupt
* type 0x02 has been received for a path that has been established * type 0x02 has been received for a path that has been established
* for this handler with iucv_path_connect and got accepted by the * for this handler with iucv_path_connect and got accepted by the
* peer with iucv_path_accept. * peer with iucv_path_accept.
*/ */
void (*path_complete)(struct iucv_path *, u8 ipuser[16]); void (*path_complete)(struct iucv_path *, u8 *ipuser);
/* /*
* The path_severed function is called after an iucv interrupt * The path_severed function is called after an iucv interrupt
* type 0x03 has been received. The communication peer shutdown * type 0x03 has been received. The communication peer shutdown
...@@ -156,20 +156,20 @@ struct iucv_handler { ...@@ -156,20 +156,20 @@ struct iucv_handler {
* remaining messages can be received until a iucv_path_sever * remaining messages can be received until a iucv_path_sever
* shuts down the other end of the path as well. * shuts down the other end of the path as well.
*/ */
void (*path_severed)(struct iucv_path *, u8 ipuser[16]); void (*path_severed)(struct iucv_path *, u8 *ipuser);
/* /*
* The path_quiesced function is called after an icuv interrupt * The path_quiesced function is called after an icuv interrupt
* type 0x04 has been received. The communication peer has quiesced * type 0x04 has been received. The communication peer has quiesced
* the path. Delivery of messages is stopped until iucv_path_resume * the path. Delivery of messages is stopped until iucv_path_resume
* has been called. * has been called.
*/ */
void (*path_quiesced)(struct iucv_path *, u8 ipuser[16]); void (*path_quiesced)(struct iucv_path *, u8 *ipuser);
/* /*
* The path_resumed function is called after an icuv interrupt * The path_resumed function is called after an icuv interrupt
* type 0x05 has been received. The communication peer has resumed * type 0x05 has been received. The communication peer has resumed
* the path. * the path.
*/ */
void (*path_resumed)(struct iucv_path *, u8 ipuser[16]); void (*path_resumed)(struct iucv_path *, u8 *ipuser);
/* /*
* The message_pending function is called after an icuv interrupt * The message_pending function is called after an icuv interrupt
* type 0x06 or type 0x07 has been received. A new message is * type 0x06 or type 0x07 has been received. A new message is
...@@ -256,7 +256,7 @@ static inline void iucv_path_free(struct iucv_path *path) ...@@ -256,7 +256,7 @@ static inline void iucv_path_free(struct iucv_path *path)
* Returns the result of the CP IUCV call. * Returns the result of the CP IUCV call.
*/ */
int iucv_path_accept(struct iucv_path *path, struct iucv_handler *handler, int iucv_path_accept(struct iucv_path *path, struct iucv_handler *handler,
u8 userdata[16], void *private); u8 *userdata, void *private);
/** /**
* iucv_path_connect * iucv_path_connect
...@@ -274,7 +274,7 @@ int iucv_path_accept(struct iucv_path *path, struct iucv_handler *handler, ...@@ -274,7 +274,7 @@ int iucv_path_accept(struct iucv_path *path, struct iucv_handler *handler,
* Returns the result of the CP IUCV call. * Returns the result of the CP IUCV call.
*/ */
int iucv_path_connect(struct iucv_path *path, struct iucv_handler *handler, int iucv_path_connect(struct iucv_path *path, struct iucv_handler *handler,
u8 userid[8], u8 system[8], u8 userdata[16], u8 *userid, u8 *system, u8 *userdata,
void *private); void *private);
/** /**
...@@ -287,7 +287,7 @@ int iucv_path_connect(struct iucv_path *path, struct iucv_handler *handler, ...@@ -287,7 +287,7 @@ int iucv_path_connect(struct iucv_path *path, struct iucv_handler *handler,
* *
* Returns the result from the CP IUCV call. * Returns the result from the CP IUCV call.
*/ */
int iucv_path_quiesce(struct iucv_path *path, u8 userdata[16]); int iucv_path_quiesce(struct iucv_path *path, u8 *userdata);
/** /**
* iucv_path_resume: * iucv_path_resume:
...@@ -299,7 +299,7 @@ int iucv_path_quiesce(struct iucv_path *path, u8 userdata[16]); ...@@ -299,7 +299,7 @@ int iucv_path_quiesce(struct iucv_path *path, u8 userdata[16]);
* *
* Returns the result from the CP IUCV call. * Returns the result from the CP IUCV call.
*/ */
int iucv_path_resume(struct iucv_path *path, u8 userdata[16]); int iucv_path_resume(struct iucv_path *path, u8 *userdata);
/** /**
* iucv_path_sever * iucv_path_sever
...@@ -310,7 +310,7 @@ int iucv_path_resume(struct iucv_path *path, u8 userdata[16]); ...@@ -310,7 +310,7 @@ int iucv_path_resume(struct iucv_path *path, u8 userdata[16]);
* *
* Returns the result from the CP IUCV call. * Returns the result from the CP IUCV call.
*/ */
int iucv_path_sever(struct iucv_path *path, u8 userdata[16]); int iucv_path_sever(struct iucv_path *path, u8 *userdata);
/** /**
* iucv_message_purge * iucv_message_purge
......
...@@ -95,11 +95,10 @@ static void afiucv_hs_callback_txnotify(struct sk_buff *, enum iucv_tx_notify); ...@@ -95,11 +95,10 @@ static void afiucv_hs_callback_txnotify(struct sk_buff *, enum iucv_tx_notify);
/* Call Back functions */ /* Call Back functions */
static void iucv_callback_rx(struct iucv_path *, struct iucv_message *); static void iucv_callback_rx(struct iucv_path *, struct iucv_message *);
static void iucv_callback_txdone(struct iucv_path *, struct iucv_message *); static void iucv_callback_txdone(struct iucv_path *, struct iucv_message *);
static void iucv_callback_connack(struct iucv_path *, u8 ipuser[16]); static void iucv_callback_connack(struct iucv_path *, u8 *);
static int iucv_callback_connreq(struct iucv_path *, u8 ipvmid[8], static int iucv_callback_connreq(struct iucv_path *, u8 *, u8 *);
u8 ipuser[16]); static void iucv_callback_connrej(struct iucv_path *, u8 *);
static void iucv_callback_connrej(struct iucv_path *, u8 ipuser[16]); static void iucv_callback_shutdown(struct iucv_path *, u8 *);
static void iucv_callback_shutdown(struct iucv_path *, u8 ipuser[16]);
static struct iucv_sock_list iucv_sk_list = { static struct iucv_sock_list iucv_sk_list = {
.lock = __RW_LOCK_UNLOCKED(iucv_sk_list.lock), .lock = __RW_LOCK_UNLOCKED(iucv_sk_list.lock),
......
...@@ -713,7 +713,7 @@ static struct notifier_block __refdata iucv_cpu_notifier = { ...@@ -713,7 +713,7 @@ static struct notifier_block __refdata iucv_cpu_notifier = {
* *
* Sever an iucv path to free up the pathid. Used internally. * Sever an iucv path to free up the pathid. Used internally.
*/ */
static int iucv_sever_pathid(u16 pathid, u8 userdata[16]) static int iucv_sever_pathid(u16 pathid, u8 *userdata)
{ {
union iucv_param *parm; union iucv_param *parm;
...@@ -876,7 +876,7 @@ static struct notifier_block iucv_reboot_notifier = { ...@@ -876,7 +876,7 @@ static struct notifier_block iucv_reboot_notifier = {
* Returns the result of the CP IUCV call. * Returns the result of the CP IUCV call.
*/ */
int iucv_path_accept(struct iucv_path *path, struct iucv_handler *handler, int iucv_path_accept(struct iucv_path *path, struct iucv_handler *handler,
u8 userdata[16], void *private) u8 *userdata, void *private)
{ {
union iucv_param *parm; union iucv_param *parm;
int rc; int rc;
...@@ -923,7 +923,7 @@ EXPORT_SYMBOL(iucv_path_accept); ...@@ -923,7 +923,7 @@ EXPORT_SYMBOL(iucv_path_accept);
* Returns the result of the CP IUCV call. * Returns the result of the CP IUCV call.
*/ */
int iucv_path_connect(struct iucv_path *path, struct iucv_handler *handler, int iucv_path_connect(struct iucv_path *path, struct iucv_handler *handler,
u8 userid[8], u8 system[8], u8 userdata[16], u8 *userid, u8 *system, u8 *userdata,
void *private) void *private)
{ {
union iucv_param *parm; union iucv_param *parm;
...@@ -985,7 +985,7 @@ EXPORT_SYMBOL(iucv_path_connect); ...@@ -985,7 +985,7 @@ EXPORT_SYMBOL(iucv_path_connect);
* *
* Returns the result from the CP IUCV call. * Returns the result from the CP IUCV call.
*/ */
int iucv_path_quiesce(struct iucv_path *path, u8 userdata[16]) int iucv_path_quiesce(struct iucv_path *path, u8 *userdata)
{ {
union iucv_param *parm; union iucv_param *parm;
int rc; int rc;
...@@ -1017,7 +1017,7 @@ EXPORT_SYMBOL(iucv_path_quiesce); ...@@ -1017,7 +1017,7 @@ EXPORT_SYMBOL(iucv_path_quiesce);
* *
* Returns the result from the CP IUCV call. * Returns the result from the CP IUCV call.
*/ */
int iucv_path_resume(struct iucv_path *path, u8 userdata[16]) int iucv_path_resume(struct iucv_path *path, u8 *userdata)
{ {
union iucv_param *parm; union iucv_param *parm;
int rc; int rc;
...@@ -1047,7 +1047,7 @@ int iucv_path_resume(struct iucv_path *path, u8 userdata[16]) ...@@ -1047,7 +1047,7 @@ int iucv_path_resume(struct iucv_path *path, u8 userdata[16])
* *
* Returns the result from the CP IUCV call. * Returns the result from the CP IUCV call.
*/ */
int iucv_path_sever(struct iucv_path *path, u8 userdata[16]) int iucv_path_sever(struct iucv_path *path, u8 *userdata)
{ {
int rc; int rc;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment