Commit 59b757a9 authored by Julian Wiedmann's avatar Julian Wiedmann Committed by David S. Miller

s390/qeth: streamline control code for promisc mode

We have logic to determine the desired promisc mode in _each_ code path.
Change things around so that there is a clean split between
(a) high-level code that selects the new mode, and (b) implementations
of the various mechanisms to program this mode.

This also keeps qeth_promisc_to_bridge() from polluting the debug logs
on each RX modeset.
Signed-off-by: default avatarJulian Wiedmann <jwi@linux.ibm.com>
Reviewed-by: default avatarAlexandra Winter <wintera@linux.ibm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 2744d811
...@@ -653,6 +653,7 @@ struct qeth_card_info { ...@@ -653,6 +653,7 @@ struct qeth_card_info {
__u16 func_level; __u16 func_level;
char mcl_level[QETH_MCL_LENGTH + 1]; char mcl_level[QETH_MCL_LENGTH + 1];
u8 open_when_online:1; u8 open_when_online:1;
u8 promisc_mode:1;
u8 use_v1_blkt:1; u8 use_v1_blkt:1;
u8 is_vm_nic:1; u8 is_vm_nic:1;
int mac_bits; int mac_bits;
...@@ -662,7 +663,6 @@ struct qeth_card_info { ...@@ -662,7 +663,6 @@ struct qeth_card_info {
int unique_id; int unique_id;
bool layer_enforced; bool layer_enforced;
struct qeth_card_blkt blkt; struct qeth_card_blkt blkt;
enum qeth_ipa_promisc_modes promisc_mode;
__u32 diagass_support; __u32 diagass_support;
__u32 hwtrap; __u32 hwtrap;
}; };
...@@ -1004,7 +1004,7 @@ void qeth_clear_ipacmd_list(struct qeth_card *); ...@@ -1004,7 +1004,7 @@ void qeth_clear_ipacmd_list(struct qeth_card *);
int qeth_qdio_clear_card(struct qeth_card *, int); int qeth_qdio_clear_card(struct qeth_card *, int);
void qeth_clear_working_pool_list(struct qeth_card *); void qeth_clear_working_pool_list(struct qeth_card *);
void qeth_drain_output_queues(struct qeth_card *card); void qeth_drain_output_queues(struct qeth_card *card);
void qeth_setadp_promisc_mode(struct qeth_card *); void qeth_setadp_promisc_mode(struct qeth_card *card, bool enable);
int qeth_setadpparms_change_macaddr(struct qeth_card *); int qeth_setadpparms_change_macaddr(struct qeth_card *);
void qeth_tx_timeout(struct net_device *); void qeth_tx_timeout(struct net_device *);
void qeth_prepare_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob, void qeth_prepare_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
......
...@@ -4015,23 +4015,14 @@ static int qeth_setadp_promisc_mode_cb(struct qeth_card *card, ...@@ -4015,23 +4015,14 @@ static int qeth_setadp_promisc_mode_cb(struct qeth_card *card,
return (cmd->hdr.return_code) ? -EIO : 0; return (cmd->hdr.return_code) ? -EIO : 0;
} }
void qeth_setadp_promisc_mode(struct qeth_card *card) void qeth_setadp_promisc_mode(struct qeth_card *card, bool enable)
{ {
enum qeth_ipa_promisc_modes mode; enum qeth_ipa_promisc_modes mode = enable ? SET_PROMISC_MODE_ON :
struct net_device *dev = card->dev; SET_PROMISC_MODE_OFF;
struct qeth_cmd_buffer *iob; struct qeth_cmd_buffer *iob;
struct qeth_ipa_cmd *cmd; struct qeth_ipa_cmd *cmd;
QETH_CARD_TEXT(card, 4, "setprom"); QETH_CARD_TEXT(card, 4, "setprom");
if (((dev->flags & IFF_PROMISC) &&
(card->info.promisc_mode == SET_PROMISC_MODE_ON)) ||
(!(dev->flags & IFF_PROMISC) &&
(card->info.promisc_mode == SET_PROMISC_MODE_OFF)))
return;
mode = SET_PROMISC_MODE_OFF;
if (dev->flags & IFF_PROMISC)
mode = SET_PROMISC_MODE_ON;
QETH_CARD_TEXT_(card, 4, "mode:%x", mode); QETH_CARD_TEXT_(card, 4, "mode:%x", mode);
iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_PROMISC_MODE, iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_PROMISC_MODE,
......
...@@ -439,23 +439,14 @@ static int qeth_l2_set_mac_address(struct net_device *dev, void *p) ...@@ -439,23 +439,14 @@ static int qeth_l2_set_mac_address(struct net_device *dev, void *p)
return 0; return 0;
} }
static void qeth_promisc_to_bridge(struct qeth_card *card) static void qeth_l2_promisc_to_bridge(struct qeth_card *card, bool enable)
{ {
struct net_device *dev = card->dev;
enum qeth_ipa_promisc_modes promisc_mode;
int role; int role;
int rc; int rc;
QETH_CARD_TEXT(card, 3, "pmisc2br"); QETH_CARD_TEXT(card, 3, "pmisc2br");
if (!card->options.sbp.reflect_promisc) if (enable) {
return;
promisc_mode = (dev->flags & IFF_PROMISC) ? SET_PROMISC_MODE_ON
: SET_PROMISC_MODE_OFF;
if (promisc_mode == card->info.promisc_mode)
return;
if (promisc_mode == SET_PROMISC_MODE_ON) {
if (card->options.sbp.reflect_promisc_primary) if (card->options.sbp.reflect_promisc_primary)
role = QETH_SBP_ROLE_PRIMARY; role = QETH_SBP_ROLE_PRIMARY;
else else
...@@ -464,14 +455,26 @@ static void qeth_promisc_to_bridge(struct qeth_card *card) ...@@ -464,14 +455,26 @@ static void qeth_promisc_to_bridge(struct qeth_card *card)
role = QETH_SBP_ROLE_NONE; role = QETH_SBP_ROLE_NONE;
rc = qeth_bridgeport_setrole(card, role); rc = qeth_bridgeport_setrole(card, role);
QETH_CARD_TEXT_(card, 2, "bpm%c%04x", QETH_CARD_TEXT_(card, 2, "bpm%c%04x", enable ? '+' : '-', rc);
(promisc_mode == SET_PROMISC_MODE_ON) ? '+' : '-', rc);
if (!rc) { if (!rc) {
card->options.sbp.role = role; card->options.sbp.role = role;
card->info.promisc_mode = promisc_mode; card->info.promisc_mode = enable;
} }
}
static void qeth_l2_set_promisc_mode(struct qeth_card *card)
{
bool enable = card->dev->flags & IFF_PROMISC;
if (card->info.promisc_mode == enable)
return;
if (qeth_adp_supported(card, IPA_SETADP_SET_PROMISC_MODE))
qeth_setadp_promisc_mode(card, enable);
else if (card->options.sbp.reflect_promisc)
qeth_l2_promisc_to_bridge(card, enable);
} }
/* New MAC address is added to the hash table and marked to be written on card /* New MAC address is added to the hash table and marked to be written on card
* only if there is not in the hash table storage already * only if there is not in the hash table storage already
* *
...@@ -539,10 +542,7 @@ static void qeth_l2_rx_mode_work(struct work_struct *work) ...@@ -539,10 +542,7 @@ static void qeth_l2_rx_mode_work(struct work_struct *work)
} }
} }
if (qeth_adp_supported(card, IPA_SETADP_SET_PROMISC_MODE)) qeth_l2_set_promisc_mode(card);
qeth_setadp_promisc_mode(card);
else
qeth_promisc_to_bridge(card);
} }
static int qeth_l2_xmit_osn(struct qeth_card *card, struct sk_buff *skb, static int qeth_l2_xmit_osn(struct qeth_card *card, struct sk_buff *skb,
......
...@@ -1435,27 +1435,19 @@ static void qeth_l3_stop_card(struct qeth_card *card) ...@@ -1435,27 +1435,19 @@ static void qeth_l3_stop_card(struct qeth_card *card)
flush_workqueue(card->event_wq); flush_workqueue(card->event_wq);
} }
/* static void qeth_l3_set_promisc_mode(struct qeth_card *card)
* test for and Switch promiscuous mode (on or off)
* either for guestlan or HiperSocket Sniffer
*/
static void
qeth_l3_handle_promisc_mode(struct qeth_card *card)
{ {
struct net_device *dev = card->dev; bool enable = card->dev->flags & IFF_PROMISC;
if (((dev->flags & IFF_PROMISC) && if (card->info.promisc_mode == enable)
(card->info.promisc_mode == SET_PROMISC_MODE_ON)) ||
(!(dev->flags & IFF_PROMISC) &&
(card->info.promisc_mode == SET_PROMISC_MODE_OFF)))
return; return;
if (IS_VM_NIC(card)) { /* Guestlan trace */ if (IS_VM_NIC(card)) { /* Guestlan trace */
if (qeth_adp_supported(card, IPA_SETADP_SET_PROMISC_MODE)) if (qeth_adp_supported(card, IPA_SETADP_SET_PROMISC_MODE))
qeth_setadp_promisc_mode(card); qeth_setadp_promisc_mode(card, enable);
} else if (card->options.sniffer && /* HiperSockets trace */ } else if (card->options.sniffer && /* HiperSockets trace */
qeth_adp_supported(card, IPA_SETADP_SET_DIAG_ASSIST)) { qeth_adp_supported(card, IPA_SETADP_SET_DIAG_ASSIST)) {
if (dev->flags & IFF_PROMISC) { if (enable) {
QETH_CARD_TEXT(card, 3, "+promisc"); QETH_CARD_TEXT(card, 3, "+promisc");
qeth_diags_trace(card, QETH_DIAGS_CMD_TRACE_ENABLE); qeth_diags_trace(card, QETH_DIAGS_CMD_TRACE_ENABLE);
} else { } else {
...@@ -1502,11 +1494,9 @@ static void qeth_l3_rx_mode_work(struct work_struct *work) ...@@ -1502,11 +1494,9 @@ static void qeth_l3_rx_mode_work(struct work_struct *work)
addr->disp_flag = QETH_DISP_ADDR_DELETE; addr->disp_flag = QETH_DISP_ADDR_DELETE;
} }
} }
if (!qeth_adp_supported(card, IPA_SETADP_SET_PROMISC_MODE))
return;
} }
qeth_l3_handle_promisc_mode(card);
qeth_l3_set_promisc_mode(card);
} }
static int qeth_l3_arp_makerc(u16 rc) static int qeth_l3_arp_makerc(u16 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