2 * Copyright IBM Corp. 2007, 2009
3 * Author(s): Utz Bacher <utz.bacher@de.ibm.com>,
4 * Frank Pavlic <fpavlic@de.ibm.com>,
5 * Thomas Spatzier <tspat@de.ibm.com>,
6 * Frank Blaschka <frank.blaschka@de.ibm.com>
9 #define KMSG_COMPONENT "qeth"
10 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
12 #include <linux/module.h>
13 #include <linux/moduleparam.h>
14 #include <linux/string.h>
15 #include <linux/errno.h>
16 #include <linux/kernel.h>
17 #include <linux/slab.h>
18 #include <linux/etherdevice.h>
19 #include <linux/mii.h>
21 #include <linux/list.h>
23 #include "qeth_core.h"
26 static int qeth_l2_set_offline(struct ccwgroup_device *);
27 static int qeth_l2_stop(struct net_device *);
28 static int qeth_l2_send_delmac(struct qeth_card *, __u8 *);
29 static int qeth_l2_send_setdelmac(struct qeth_card *, __u8 *,
31 static void qeth_l2_set_multicast_list(struct net_device *);
32 static int qeth_l2_recover(void *);
33 static void qeth_bridgeport_query_support(struct qeth_card *card);
34 static void qeth_bridge_state_change(struct qeth_card *card,
35 struct qeth_ipa_cmd *cmd);
36 static void qeth_bridge_host_event(struct qeth_card *card,
37 struct qeth_ipa_cmd *cmd);
39 static int qeth_l2_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
41 struct qeth_card *card = dev->ml_priv;
42 struct mii_ioctl_data *mii_data;
48 if (!qeth_card_hw_is_reachable(card))
51 if (card->info.type == QETH_CARD_TYPE_OSN)
55 case SIOC_QETH_ADP_SET_SNMP_CONTROL:
56 rc = qeth_snmp_command(card, rq->ifr_ifru.ifru_data);
58 case SIOC_QETH_GET_CARD_TYPE:
59 if ((card->info.type == QETH_CARD_TYPE_OSD ||
60 card->info.type == QETH_CARD_TYPE_OSM ||
61 card->info.type == QETH_CARD_TYPE_OSX) &&
67 mii_data = if_mii(rq);
71 mii_data = if_mii(rq);
72 if (mii_data->phy_id != 0)
75 mii_data->val_out = qeth_mdio_read(dev,
76 mii_data->phy_id, mii_data->reg_num);
78 case SIOC_QETH_QUERY_OAT:
79 rc = qeth_query_oat_command(card, rq->ifr_ifru.ifru_data);
85 QETH_CARD_TEXT_(card, 2, "ioce%d", rc);
89 static int qeth_l2_verify_dev(struct net_device *dev)
91 struct qeth_card *card;
95 read_lock_irqsave(&qeth_core_card_list.rwlock, flags);
96 list_for_each_entry(card, &qeth_core_card_list.list, list) {
97 if (card->dev == dev) {
102 read_unlock_irqrestore(&qeth_core_card_list.rwlock, flags);
107 static struct net_device *qeth_l2_netdev_by_devno(unsigned char *read_dev_no)
109 struct qeth_card *card;
110 struct net_device *ndev;
113 struct ccw_dev_id read_devid;
116 memcpy(&temp_dev_no, read_dev_no, 2);
117 read_lock_irqsave(&qeth_core_card_list.rwlock, flags);
118 list_for_each_entry(card, &qeth_core_card_list.list, list) {
119 ccw_device_get_id(CARD_RDEV(card), &read_devid);
120 if (read_devid.devno == temp_dev_no) {
125 read_unlock_irqrestore(&qeth_core_card_list.rwlock, flags);
129 static int qeth_setdel_makerc(struct qeth_card *card, int retcode)
134 QETH_CARD_TEXT_(card, 2, "err%04x", retcode);
139 case IPA_RC_L2_UNSUPPORTED_CMD:
142 case IPA_RC_L2_ADDR_TABLE_FULL:
145 case IPA_RC_L2_DUP_MAC:
146 case IPA_RC_L2_DUP_LAYER3_MAC:
149 case IPA_RC_L2_MAC_NOT_AUTH_BY_HYP:
150 case IPA_RC_L2_MAC_NOT_AUTH_BY_ADP:
153 case IPA_RC_L2_MAC_NOT_FOUND:
166 static int qeth_l2_send_setgroupmac(struct qeth_card *card, __u8 *mac)
170 QETH_CARD_TEXT(card, 2, "L2Sgmac");
171 rc = qeth_setdel_makerc(card, qeth_l2_send_setdelmac(card, mac,
174 QETH_DBF_MESSAGE(2, "Group MAC %pM already existing on %s\n",
175 mac, QETH_CARD_IFNAME(card));
177 QETH_DBF_MESSAGE(2, "Could not set group MAC %pM on %s: %d\n",
178 mac, QETH_CARD_IFNAME(card), rc);
182 static int qeth_l2_send_delgroupmac(struct qeth_card *card, __u8 *mac)
186 QETH_CARD_TEXT(card, 2, "L2Dgmac");
187 rc = qeth_setdel_makerc(card, qeth_l2_send_setdelmac(card, mac,
191 "Could not delete group MAC %pM on %s: %d\n",
192 mac, QETH_CARD_IFNAME(card), rc);
196 static void qeth_l2_add_mc(struct qeth_card *card, __u8 *mac, int vmac)
198 struct qeth_mc_mac *mc;
201 mc = kmalloc(sizeof(struct qeth_mc_mac), GFP_ATOMIC);
206 memcpy(mc->mc_addr, mac, OSA_ADDR_LEN);
207 mc->mc_addrlen = OSA_ADDR_LEN;
211 rc = qeth_setdel_makerc(card,
212 qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETVMAC));
214 rc = qeth_setdel_makerc(card,
215 qeth_l2_send_setgroupmac(card, mac));
219 list_add_tail(&mc->list, &card->mc_list);
224 static void qeth_l2_del_all_mc(struct qeth_card *card, int del)
226 struct qeth_mc_mac *mc, *tmp;
228 spin_lock_bh(&card->mclock);
229 list_for_each_entry_safe(mc, tmp, &card->mc_list, list) {
232 qeth_l2_send_setdelmac(card, mc->mc_addr,
235 qeth_l2_send_delgroupmac(card, mc->mc_addr);
240 spin_unlock_bh(&card->mclock);
243 static inline int qeth_l2_get_cast_type(struct qeth_card *card,
246 if (card->info.type == QETH_CARD_TYPE_OSN)
248 if (is_broadcast_ether_addr(skb->data))
249 return RTN_BROADCAST;
250 if (is_multicast_ether_addr(skb->data))
251 return RTN_MULTICAST;
255 static void qeth_l2_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
256 struct sk_buff *skb, int cast_type)
258 struct vlan_ethhdr *veth = (struct vlan_ethhdr *)skb_mac_header(skb);
260 memset(hdr, 0, sizeof(struct qeth_hdr));
261 hdr->hdr.l2.id = QETH_HEADER_TYPE_LAYER2;
263 /* set byte byte 3 to casting flags */
264 if (cast_type == RTN_MULTICAST)
265 hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_MULTICAST;
266 else if (cast_type == RTN_BROADCAST)
267 hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_BROADCAST;
269 hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_UNICAST;
271 hdr->hdr.l2.pkt_length = skb->len-QETH_HEADER_SIZE;
272 /* VSWITCH relies on the VLAN
273 * information to be present in
275 if (veth->h_vlan_proto == __constant_htons(ETH_P_8021Q)) {
276 hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_VLAN;
277 hdr->hdr.l2.vlan_id = ntohs(veth->h_vlan_TCI);
281 static int qeth_l2_send_setdelvlan_cb(struct qeth_card *card,
282 struct qeth_reply *reply, unsigned long data)
284 struct qeth_ipa_cmd *cmd;
286 QETH_CARD_TEXT(card, 2, "L2sdvcb");
287 cmd = (struct qeth_ipa_cmd *) data;
288 if (cmd->hdr.return_code) {
289 QETH_DBF_MESSAGE(2, "Error in processing VLAN %i on %s: 0x%x. "
290 "Continuing\n", cmd->data.setdelvlan.vlan_id,
291 QETH_CARD_IFNAME(card), cmd->hdr.return_code);
292 QETH_CARD_TEXT_(card, 2, "L2VL%4x", cmd->hdr.command);
293 QETH_CARD_TEXT_(card, 2, "err%d", cmd->hdr.return_code);
298 static int qeth_l2_send_setdelvlan(struct qeth_card *card, __u16 i,
299 enum qeth_ipa_cmds ipacmd)
301 struct qeth_ipa_cmd *cmd;
302 struct qeth_cmd_buffer *iob;
304 QETH_CARD_TEXT_(card, 4, "L2sdv%x", ipacmd);
305 iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4);
308 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
309 cmd->data.setdelvlan.vlan_id = i;
310 return qeth_send_ipa_cmd(card, iob,
311 qeth_l2_send_setdelvlan_cb, NULL);
314 static void qeth_l2_process_vlans(struct qeth_card *card)
316 struct qeth_vlan_vid *id;
317 QETH_CARD_TEXT(card, 3, "L2prcvln");
318 spin_lock_bh(&card->vlanlock);
319 list_for_each_entry(id, &card->vid_list, list) {
320 qeth_l2_send_setdelvlan(card, id->vid, IPA_CMD_SETVLAN);
322 spin_unlock_bh(&card->vlanlock);
325 static int qeth_l2_vlan_rx_add_vid(struct net_device *dev,
326 __be16 proto, u16 vid)
328 struct qeth_card *card = dev->ml_priv;
329 struct qeth_vlan_vid *id;
332 QETH_CARD_TEXT_(card, 4, "aid:%d", vid);
335 if (card->info.type == QETH_CARD_TYPE_OSM) {
336 QETH_CARD_TEXT(card, 3, "aidOSM");
339 if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) {
340 QETH_CARD_TEXT(card, 3, "aidREC");
343 id = kmalloc(sizeof(struct qeth_vlan_vid), GFP_ATOMIC);
346 rc = qeth_l2_send_setdelvlan(card, vid, IPA_CMD_SETVLAN);
351 spin_lock_bh(&card->vlanlock);
352 list_add_tail(&id->list, &card->vid_list);
353 spin_unlock_bh(&card->vlanlock);
360 static int qeth_l2_vlan_rx_kill_vid(struct net_device *dev,
361 __be16 proto, u16 vid)
363 struct qeth_vlan_vid *id, *tmpid = NULL;
364 struct qeth_card *card = dev->ml_priv;
367 QETH_CARD_TEXT_(card, 4, "kid:%d", vid);
368 if (card->info.type == QETH_CARD_TYPE_OSM) {
369 QETH_CARD_TEXT(card, 3, "kidOSM");
372 if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) {
373 QETH_CARD_TEXT(card, 3, "kidREC");
376 spin_lock_bh(&card->vlanlock);
377 list_for_each_entry(id, &card->vid_list, list) {
378 if (id->vid == vid) {
384 spin_unlock_bh(&card->vlanlock);
386 rc = qeth_l2_send_setdelvlan(card, vid, IPA_CMD_DELVLAN);
389 qeth_l2_set_multicast_list(card->dev);
393 static void qeth_l2_stop_card(struct qeth_card *card, int recovery_mode)
395 QETH_DBF_TEXT(SETUP , 2, "stopcard");
396 QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
398 qeth_set_allowed_threads(card, 0, 1);
399 if (card->read.state == CH_STATE_UP &&
400 card->write.state == CH_STATE_UP &&
401 (card->state == CARD_STATE_UP)) {
403 card->info.type != QETH_CARD_TYPE_OSN) {
404 qeth_l2_stop(card->dev);
407 dev_close(card->dev);
410 card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED;
411 card->state = CARD_STATE_SOFTSETUP;
413 if (card->state == CARD_STATE_SOFTSETUP) {
414 qeth_l2_del_all_mc(card, 0);
415 qeth_clear_ipacmd_list(card);
416 card->state = CARD_STATE_HARDSETUP;
418 if (card->state == CARD_STATE_HARDSETUP) {
419 qeth_qdio_clear_card(card, 0);
420 qeth_clear_qdio_buffers(card);
421 qeth_clear_working_pool_list(card);
422 card->state = CARD_STATE_DOWN;
424 if (card->state == CARD_STATE_DOWN) {
425 qeth_clear_cmd_buffers(&card->read);
426 qeth_clear_cmd_buffers(&card->write);
430 static int qeth_l2_process_inbound_buffer(struct qeth_card *card,
431 int budget, int *done)
435 struct qeth_hdr *hdr;
439 WARN_ON_ONCE(!budget);
441 skb = qeth_core_get_next_skb(card,
442 &card->qdio.in_q->bufs[card->rx.b_index],
443 &card->rx.b_element, &card->rx.e_offset, &hdr);
448 skb->dev = card->dev;
449 switch (hdr->hdr.l2.id) {
450 case QETH_HEADER_TYPE_LAYER2:
451 skb->pkt_type = PACKET_HOST;
452 skb->protocol = eth_type_trans(skb, skb->dev);
453 skb->ip_summed = CHECKSUM_NONE;
454 if (skb->protocol == htons(ETH_P_802_2))
455 *((__u32 *)skb->cb) = ++card->seqno.pkt_seqno;
457 netif_receive_skb(skb);
459 case QETH_HEADER_TYPE_OSN:
460 if (card->info.type == QETH_CARD_TYPE_OSN) {
461 skb_push(skb, sizeof(struct qeth_hdr));
462 skb_copy_to_linear_data(skb, hdr,
463 sizeof(struct qeth_hdr));
465 card->osn_info.data_cb(skb);
470 dev_kfree_skb_any(skb);
471 QETH_CARD_TEXT(card, 3, "inbunkno");
472 QETH_DBF_HEX(CTRL, 3, hdr, QETH_DBF_CTRL_LEN);
477 card->stats.rx_packets++;
478 card->stats.rx_bytes += len;
483 static int qeth_l2_poll(struct napi_struct *napi, int budget)
485 struct qeth_card *card = container_of(napi, struct qeth_card, napi);
487 struct qeth_qdio_buffer *buffer;
489 int new_budget = budget;
491 if (card->options.performance_stats) {
492 card->perf_stats.inbound_cnt++;
493 card->perf_stats.inbound_start_time = qeth_get_micros();
497 if (!card->rx.b_count) {
498 card->rx.qdio_err = 0;
499 card->rx.b_count = qdio_get_next_buffers(
500 card->data.ccwdev, 0, &card->rx.b_index,
502 if (card->rx.b_count <= 0) {
503 card->rx.b_count = 0;
507 &card->qdio.in_q->bufs[card->rx.b_index]
509 card->rx.e_offset = 0;
512 while (card->rx.b_count) {
513 buffer = &card->qdio.in_q->bufs[card->rx.b_index];
514 if (!(card->rx.qdio_err &&
515 qeth_check_qdio_errors(card, buffer->buffer,
516 card->rx.qdio_err, "qinerr")))
517 work_done += qeth_l2_process_inbound_buffer(
518 card, new_budget, &done);
523 if (card->options.performance_stats)
524 card->perf_stats.bufs_rec++;
525 qeth_put_buffer_pool_entry(card,
527 qeth_queue_input_buffer(card, card->rx.b_index);
529 if (card->rx.b_count) {
531 (card->rx.b_index + 1) %
532 QDIO_MAX_BUFFERS_PER_Q;
535 ->bufs[card->rx.b_index]
537 card->rx.e_offset = 0;
541 if (work_done >= budget)
544 new_budget = budget - work_done;
549 if (qdio_start_irq(card->data.ccwdev, 0))
550 napi_schedule(&card->napi);
552 if (card->options.performance_stats)
553 card->perf_stats.inbound_time += qeth_get_micros() -
554 card->perf_stats.inbound_start_time;
558 static int qeth_l2_send_setdelmac(struct qeth_card *card, __u8 *mac,
559 enum qeth_ipa_cmds ipacmd)
561 struct qeth_ipa_cmd *cmd;
562 struct qeth_cmd_buffer *iob;
564 QETH_CARD_TEXT(card, 2, "L2sdmac");
565 iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4);
568 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
569 cmd->data.setdelmac.mac_length = OSA_ADDR_LEN;
570 memcpy(&cmd->data.setdelmac.mac, mac, OSA_ADDR_LEN);
571 return qeth_send_ipa_cmd(card, iob, NULL, NULL);
574 static int qeth_l2_send_setmac(struct qeth_card *card, __u8 *mac)
578 QETH_CARD_TEXT(card, 2, "L2Setmac");
579 rc = qeth_setdel_makerc(card, qeth_l2_send_setdelmac(card, mac,
582 card->info.mac_bits |= QETH_LAYER2_MAC_REGISTERED;
583 memcpy(card->dev->dev_addr, mac, OSA_ADDR_LEN);
584 dev_info(&card->gdev->dev,
585 "MAC address %pM successfully registered on device %s\n",
586 card->dev->dev_addr, card->dev->name);
588 card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED;
591 dev_warn(&card->gdev->dev,
592 "MAC address %pM already exists\n", mac);
595 dev_warn(&card->gdev->dev,
596 "MAC address %pM is not authorized\n", mac);
603 static int qeth_l2_send_delmac(struct qeth_card *card, __u8 *mac)
607 QETH_CARD_TEXT(card, 2, "L2Delmac");
608 if (!(card->info.mac_bits & QETH_LAYER2_MAC_REGISTERED))
610 rc = qeth_setdel_makerc(card, qeth_l2_send_setdelmac(card, mac,
613 card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED;
617 static int qeth_l2_request_initial_mac(struct qeth_card *card)
620 char vendor_pre[] = {0x02, 0x00, 0x00};
622 QETH_DBF_TEXT(SETUP, 2, "doL2init");
623 QETH_DBF_TEXT_(SETUP, 2, "doL2%s", CARD_BUS_ID(card));
625 if (qeth_is_supported(card, IPA_SETADAPTERPARMS)) {
626 rc = qeth_query_setadapterparms(card);
628 QETH_DBF_MESSAGE(2, "could not query adapter "
629 "parameters on device %s: x%x\n",
630 CARD_BUS_ID(card), rc);
634 if (card->info.type == QETH_CARD_TYPE_IQD ||
635 card->info.type == QETH_CARD_TYPE_OSM ||
636 card->info.type == QETH_CARD_TYPE_OSX ||
637 card->info.guestlan) {
638 rc = qeth_setadpparms_change_macaddr(card);
640 QETH_DBF_MESSAGE(2, "couldn't get MAC address on "
641 "device %s: x%x\n", CARD_BUS_ID(card), rc);
642 QETH_DBF_TEXT_(SETUP, 2, "1err%04x", rc);
645 QETH_DBF_HEX(SETUP, 2, card->dev->dev_addr, OSA_ADDR_LEN);
647 eth_random_addr(card->dev->dev_addr);
648 memcpy(card->dev->dev_addr, vendor_pre, 3);
653 static int qeth_l2_set_mac_address(struct net_device *dev, void *p)
655 struct sockaddr *addr = p;
656 struct qeth_card *card = dev->ml_priv;
659 QETH_CARD_TEXT(card, 3, "setmac");
661 if (qeth_l2_verify_dev(dev) != QETH_REAL_CARD) {
662 QETH_CARD_TEXT(card, 3, "setmcINV");
666 if (card->info.type == QETH_CARD_TYPE_OSN ||
667 card->info.type == QETH_CARD_TYPE_OSM ||
668 card->info.type == QETH_CARD_TYPE_OSX) {
669 QETH_CARD_TEXT(card, 3, "setmcTYP");
672 QETH_CARD_HEX(card, 3, addr->sa_data, OSA_ADDR_LEN);
673 if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) {
674 QETH_CARD_TEXT(card, 3, "setmcREC");
677 rc = qeth_l2_send_delmac(card, &card->dev->dev_addr[0]);
678 if (!rc || (rc == -ENOENT))
679 rc = qeth_l2_send_setmac(card, addr->sa_data);
680 return rc ? -EINVAL : 0;
683 static void qeth_promisc_to_bridge(struct qeth_card *card)
685 struct net_device *dev = card->dev;
686 enum qeth_ipa_promisc_modes promisc_mode;
690 QETH_CARD_TEXT(card, 3, "pmisc2br");
692 if (!card->options.sbp.reflect_promisc)
694 promisc_mode = (dev->flags & IFF_PROMISC) ? SET_PROMISC_MODE_ON
695 : SET_PROMISC_MODE_OFF;
696 if (promisc_mode == card->info.promisc_mode)
699 if (promisc_mode == SET_PROMISC_MODE_ON) {
700 if (card->options.sbp.reflect_promisc_primary)
701 role = QETH_SBP_ROLE_PRIMARY;
703 role = QETH_SBP_ROLE_SECONDARY;
705 role = QETH_SBP_ROLE_NONE;
707 rc = qeth_bridgeport_setrole(card, role);
708 QETH_DBF_TEXT_(SETUP, 2, "bpm%c%04x",
709 (promisc_mode == SET_PROMISC_MODE_ON) ? '+' : '-', rc);
711 card->options.sbp.role = role;
712 card->info.promisc_mode = promisc_mode;
716 static void qeth_l2_set_multicast_list(struct net_device *dev)
718 struct qeth_card *card = dev->ml_priv;
719 struct netdev_hw_addr *ha;
721 if (card->info.type == QETH_CARD_TYPE_OSN)
724 QETH_CARD_TEXT(card, 3, "setmulti");
725 if (qeth_threads_running(card, QETH_RECOVER_THREAD) &&
726 (card->state != CARD_STATE_UP))
728 qeth_l2_del_all_mc(card, 1);
729 spin_lock_bh(&card->mclock);
730 netdev_for_each_mc_addr(ha, dev)
731 qeth_l2_add_mc(card, ha->addr, 0);
733 netdev_for_each_uc_addr(ha, dev)
734 qeth_l2_add_mc(card, ha->addr, 1);
736 spin_unlock_bh(&card->mclock);
737 if (qeth_adp_supported(card, IPA_SETADP_SET_PROMISC_MODE))
738 qeth_setadp_promisc_mode(card);
740 qeth_promisc_to_bridge(card);
743 static int qeth_l2_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
746 struct qeth_hdr *hdr = NULL;
748 struct qeth_card *card = dev->ml_priv;
749 struct sk_buff *new_skb = skb;
750 int cast_type = qeth_l2_get_cast_type(card, skb);
751 struct qeth_qdio_out_q *queue;
752 int tx_bytes = skb->len;
753 int data_offset = -1;
754 int elements_needed = 0;
757 if (card->qdio.do_prio_queueing || (cast_type &&
758 card->info.is_multicast_different))
759 queue = card->qdio.out_qs[qeth_get_priority_queue(card, skb,
760 qeth_get_ip_version(skb), cast_type)];
762 queue = card->qdio.out_qs[card->qdio.default_out_queue];
764 if ((card->state != CARD_STATE_UP) || !card->lan_online) {
765 card->stats.tx_carrier_errors++;
769 if ((card->info.type == QETH_CARD_TYPE_OSN) &&
770 (skb->protocol == htons(ETH_P_IPV6)))
773 if (card->options.performance_stats) {
774 card->perf_stats.outbound_cnt++;
775 card->perf_stats.outbound_start_time = qeth_get_micros();
777 netif_stop_queue(dev);
779 if (card->info.type == QETH_CARD_TYPE_OSN)
780 hdr = (struct qeth_hdr *)skb->data;
782 if (card->info.type == QETH_CARD_TYPE_IQD) {
784 data_offset = ETH_HLEN;
786 hdr = kmem_cache_alloc(qeth_core_header_cache,
791 skb_reset_mac_header(new_skb);
792 qeth_l2_fill_header(card, hdr, new_skb, cast_type);
793 hdr->hdr.l2.pkt_length = new_skb->len;
794 memcpy(((char *)hdr) + sizeof(struct qeth_hdr),
795 skb_mac_header(new_skb), ETH_HLEN);
797 /* create a clone with writeable headroom */
798 new_skb = skb_realloc_headroom(skb,
799 sizeof(struct qeth_hdr));
802 hdr = (struct qeth_hdr *)skb_push(new_skb,
803 sizeof(struct qeth_hdr));
804 skb_set_mac_header(new_skb, sizeof(struct qeth_hdr));
805 qeth_l2_fill_header(card, hdr, new_skb, cast_type);
809 elements = qeth_get_elements_no(card, new_skb, elements_needed);
811 if (data_offset >= 0)
812 kmem_cache_free(qeth_core_header_cache, hdr);
816 if (card->info.type != QETH_CARD_TYPE_IQD) {
817 if (qeth_hdr_chk_and_bounce(new_skb, &hdr,
818 sizeof(struct qeth_hdr_layer2)))
820 rc = qeth_do_send_packet(card, queue, new_skb, hdr,
823 rc = qeth_do_send_packet_fast(card, queue, new_skb, hdr,
824 elements, data_offset, hd_len);
826 card->stats.tx_packets++;
827 card->stats.tx_bytes += tx_bytes;
829 dev_kfree_skb_any(skb);
832 if (data_offset >= 0)
833 kmem_cache_free(qeth_core_header_cache, hdr);
837 dev_kfree_skb_any(new_skb);
838 return NETDEV_TX_BUSY;
843 netif_wake_queue(dev);
844 if (card->options.performance_stats)
845 card->perf_stats.outbound_time += qeth_get_micros() -
846 card->perf_stats.outbound_start_time;
850 card->stats.tx_dropped++;
851 card->stats.tx_errors++;
852 if ((new_skb != skb) && new_skb)
853 dev_kfree_skb_any(new_skb);
854 dev_kfree_skb_any(skb);
855 netif_wake_queue(dev);
859 static int __qeth_l2_open(struct net_device *dev)
861 struct qeth_card *card = dev->ml_priv;
864 QETH_CARD_TEXT(card, 4, "qethopen");
865 if (card->state == CARD_STATE_UP)
867 if (card->state != CARD_STATE_SOFTSETUP)
870 if ((card->info.type != QETH_CARD_TYPE_OSN) &&
871 (!(card->info.mac_bits & QETH_LAYER2_MAC_REGISTERED))) {
872 QETH_CARD_TEXT(card, 4, "nomacadr");
875 card->data.state = CH_STATE_UP;
876 card->state = CARD_STATE_UP;
877 netif_start_queue(dev);
879 if (qdio_stop_irq(card->data.ccwdev, 0) >= 0) {
880 napi_enable(&card->napi);
881 napi_schedule(&card->napi);
887 static int qeth_l2_open(struct net_device *dev)
889 struct qeth_card *card = dev->ml_priv;
891 QETH_CARD_TEXT(card, 5, "qethope_");
892 if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) {
893 QETH_CARD_TEXT(card, 3, "openREC");
896 return __qeth_l2_open(dev);
899 static int qeth_l2_stop(struct net_device *dev)
901 struct qeth_card *card = dev->ml_priv;
903 QETH_CARD_TEXT(card, 4, "qethstop");
904 netif_tx_disable(dev);
905 if (card->state == CARD_STATE_UP) {
906 card->state = CARD_STATE_SOFTSETUP;
907 napi_disable(&card->napi);
912 static int qeth_l2_probe_device(struct ccwgroup_device *gdev)
914 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
916 qeth_l2_create_device_attributes(&gdev->dev);
917 INIT_LIST_HEAD(&card->vid_list);
918 INIT_LIST_HEAD(&card->mc_list);
919 card->options.layer2 = 1;
920 card->info.hwtrap = 0;
924 static void qeth_l2_remove_device(struct ccwgroup_device *cgdev)
926 struct qeth_card *card = dev_get_drvdata(&cgdev->dev);
928 qeth_l2_remove_device_attributes(&cgdev->dev);
929 qeth_set_allowed_threads(card, 0, 1);
930 wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0);
932 if (cgdev->state == CCWGROUP_ONLINE)
933 qeth_l2_set_offline(cgdev);
936 unregister_netdev(card->dev);
942 static const struct ethtool_ops qeth_l2_ethtool_ops = {
943 .get_link = ethtool_op_get_link,
944 .get_strings = qeth_core_get_strings,
945 .get_ethtool_stats = qeth_core_get_ethtool_stats,
946 .get_sset_count = qeth_core_get_sset_count,
947 .get_drvinfo = qeth_core_get_drvinfo,
948 .get_settings = qeth_core_ethtool_get_settings,
951 static const struct ethtool_ops qeth_l2_osn_ops = {
952 .get_strings = qeth_core_get_strings,
953 .get_ethtool_stats = qeth_core_get_ethtool_stats,
954 .get_sset_count = qeth_core_get_sset_count,
955 .get_drvinfo = qeth_core_get_drvinfo,
958 static const struct net_device_ops qeth_l2_netdev_ops = {
959 .ndo_open = qeth_l2_open,
960 .ndo_stop = qeth_l2_stop,
961 .ndo_get_stats = qeth_get_stats,
962 .ndo_start_xmit = qeth_l2_hard_start_xmit,
963 .ndo_validate_addr = eth_validate_addr,
964 .ndo_set_rx_mode = qeth_l2_set_multicast_list,
965 .ndo_do_ioctl = qeth_l2_do_ioctl,
966 .ndo_set_mac_address = qeth_l2_set_mac_address,
967 .ndo_change_mtu = qeth_change_mtu,
968 .ndo_vlan_rx_add_vid = qeth_l2_vlan_rx_add_vid,
969 .ndo_vlan_rx_kill_vid = qeth_l2_vlan_rx_kill_vid,
970 .ndo_tx_timeout = qeth_tx_timeout,
973 static int qeth_l2_setup_netdev(struct qeth_card *card)
975 switch (card->info.type) {
976 case QETH_CARD_TYPE_IQD:
977 card->dev = alloc_netdev(0, "hsi%d", NET_NAME_UNKNOWN,
980 case QETH_CARD_TYPE_OSN:
981 card->dev = alloc_netdev(0, "osn%d", NET_NAME_UNKNOWN,
983 card->dev->flags |= IFF_NOARP;
986 card->dev = alloc_etherdev(0);
992 card->dev->ml_priv = card;
993 card->dev->watchdog_timeo = QETH_TX_TIMEOUT;
994 card->dev->mtu = card->info.initial_mtu;
995 card->dev->netdev_ops = &qeth_l2_netdev_ops;
996 card->dev->ethtool_ops =
997 (card->info.type != QETH_CARD_TYPE_OSN) ?
998 &qeth_l2_ethtool_ops : &qeth_l2_osn_ops;
999 card->dev->features |= NETIF_F_HW_VLAN_CTAG_FILTER;
1000 card->info.broadcast_capable = 1;
1001 qeth_l2_request_initial_mac(card);
1002 SET_NETDEV_DEV(card->dev, &card->gdev->dev);
1003 netif_napi_add(card->dev, &card->napi, qeth_l2_poll, QETH_NAPI_WEIGHT);
1004 return register_netdev(card->dev);
1007 static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode)
1009 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
1011 enum qeth_card_states recover_flag;
1013 mutex_lock(&card->discipline_mutex);
1014 mutex_lock(&card->conf_mutex);
1015 QETH_DBF_TEXT(SETUP, 2, "setonlin");
1016 QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
1018 recover_flag = card->state;
1019 rc = qeth_core_hardsetup_card(card);
1021 QETH_DBF_TEXT_(SETUP, 2, "2err%04x", rc);
1025 qeth_bridgeport_query_support(card);
1026 if (card->options.sbp.supported_funcs)
1027 dev_info(&card->gdev->dev,
1028 "The device represents a Bridge Capable Port\n");
1029 qeth_trace_features(card);
1031 if (!card->dev && qeth_l2_setup_netdev(card)) {
1036 if (card->info.type != QETH_CARD_TYPE_OSN)
1037 qeth_l2_send_setmac(card, &card->dev->dev_addr[0]);
1039 if (qeth_is_diagass_supported(card, QETH_DIAGS_CMD_TRAP)) {
1040 if (card->info.hwtrap &&
1041 qeth_hw_trap(card, QETH_DIAGS_TRAP_ARM))
1042 card->info.hwtrap = 0;
1044 card->info.hwtrap = 0;
1046 qeth_l2_setup_bridgeport_attrs(card);
1048 card->state = CARD_STATE_HARDSETUP;
1049 memset(&card->rx, 0, sizeof(struct qeth_rx));
1050 qeth_print_status_message(card);
1053 QETH_DBF_TEXT(SETUP, 2, "softsetp");
1055 rc = qeth_send_startlan(card);
1057 QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
1059 dev_warn(&card->gdev->dev,
1060 "The LAN is offline\n");
1061 card->lan_online = 0;
1067 card->lan_online = 1;
1070 if ((card->info.type == QETH_CARD_TYPE_OSD) ||
1071 (card->info.type == QETH_CARD_TYPE_OSX)) {
1072 /* configure isolation level */
1073 rc = qeth_set_access_ctrl_online(card, 0);
1080 if (card->info.type != QETH_CARD_TYPE_OSN &&
1081 card->info.type != QETH_CARD_TYPE_OSM)
1082 qeth_l2_process_vlans(card);
1084 netif_tx_disable(card->dev);
1086 rc = qeth_init_qdio_queues(card);
1088 QETH_DBF_TEXT_(SETUP, 2, "6err%d", rc);
1092 card->state = CARD_STATE_SOFTSETUP;
1093 if (card->lan_online)
1094 netif_carrier_on(card->dev);
1096 netif_carrier_off(card->dev);
1098 qeth_set_allowed_threads(card, 0xffffffff, 0);
1099 if (recover_flag == CARD_STATE_RECOVER) {
1100 if (recovery_mode &&
1101 card->info.type != QETH_CARD_TYPE_OSN) {
1102 __qeth_l2_open(card->dev);
1105 dev_open(card->dev);
1108 /* this also sets saved unicast addresses */
1109 qeth_l2_set_multicast_list(card->dev);
1111 /* let user_space know that device is online */
1112 kobject_uevent(&gdev->dev.kobj, KOBJ_CHANGE);
1113 mutex_unlock(&card->conf_mutex);
1114 mutex_unlock(&card->discipline_mutex);
1118 qeth_l2_stop_card(card, 0);
1119 ccw_device_set_offline(CARD_DDEV(card));
1120 ccw_device_set_offline(CARD_WDEV(card));
1121 ccw_device_set_offline(CARD_RDEV(card));
1122 qdio_free(CARD_DDEV(card));
1123 if (recover_flag == CARD_STATE_RECOVER)
1124 card->state = CARD_STATE_RECOVER;
1126 card->state = CARD_STATE_DOWN;
1127 mutex_unlock(&card->conf_mutex);
1128 mutex_unlock(&card->discipline_mutex);
1132 static int qeth_l2_set_online(struct ccwgroup_device *gdev)
1134 return __qeth_l2_set_online(gdev, 0);
1137 static int __qeth_l2_set_offline(struct ccwgroup_device *cgdev,
1140 struct qeth_card *card = dev_get_drvdata(&cgdev->dev);
1141 int rc = 0, rc2 = 0, rc3 = 0;
1142 enum qeth_card_states recover_flag;
1144 mutex_lock(&card->discipline_mutex);
1145 mutex_lock(&card->conf_mutex);
1146 QETH_DBF_TEXT(SETUP, 3, "setoffl");
1147 QETH_DBF_HEX(SETUP, 3, &card, sizeof(void *));
1149 if (card->dev && netif_carrier_ok(card->dev))
1150 netif_carrier_off(card->dev);
1151 recover_flag = card->state;
1152 if ((!recovery_mode && card->info.hwtrap) || card->info.hwtrap == 2) {
1153 qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM);
1154 card->info.hwtrap = 1;
1156 qeth_l2_stop_card(card, recovery_mode);
1157 rc = ccw_device_set_offline(CARD_DDEV(card));
1158 rc2 = ccw_device_set_offline(CARD_WDEV(card));
1159 rc3 = ccw_device_set_offline(CARD_RDEV(card));
1161 rc = (rc2) ? rc2 : rc3;
1163 QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
1164 qdio_free(CARD_DDEV(card));
1165 if (recover_flag == CARD_STATE_UP)
1166 card->state = CARD_STATE_RECOVER;
1167 /* let user_space know that device is offline */
1168 kobject_uevent(&cgdev->dev.kobj, KOBJ_CHANGE);
1169 mutex_unlock(&card->conf_mutex);
1170 mutex_unlock(&card->discipline_mutex);
1174 static int qeth_l2_set_offline(struct ccwgroup_device *cgdev)
1176 return __qeth_l2_set_offline(cgdev, 0);
1179 static int qeth_l2_recover(void *ptr)
1181 struct qeth_card *card;
1184 card = (struct qeth_card *) ptr;
1185 QETH_CARD_TEXT(card, 2, "recover1");
1186 if (!qeth_do_run_thread(card, QETH_RECOVER_THREAD))
1188 QETH_CARD_TEXT(card, 2, "recover2");
1189 dev_warn(&card->gdev->dev,
1190 "A recovery process has been started for the device\n");
1191 qeth_set_recovery_task(card);
1192 __qeth_l2_set_offline(card->gdev, 1);
1193 rc = __qeth_l2_set_online(card->gdev, 1);
1195 dev_info(&card->gdev->dev,
1196 "Device successfully recovered!\n");
1198 qeth_close_dev(card);
1199 dev_warn(&card->gdev->dev, "The qeth device driver "
1200 "failed to recover an error on the device\n");
1202 qeth_clear_recovery_task(card);
1203 qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD);
1204 qeth_clear_thread_running_bit(card, QETH_RECOVER_THREAD);
1208 static int __init qeth_l2_init(void)
1210 pr_info("register layer 2 discipline\n");
1214 static void __exit qeth_l2_exit(void)
1216 pr_info("unregister layer 2 discipline\n");
1219 static void qeth_l2_shutdown(struct ccwgroup_device *gdev)
1221 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
1222 qeth_set_allowed_threads(card, 0, 1);
1223 if ((gdev->state == CCWGROUP_ONLINE) && card->info.hwtrap)
1224 qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM);
1225 qeth_qdio_clear_card(card, 0);
1226 qeth_clear_qdio_buffers(card);
1227 qdio_free(CARD_DDEV(card));
1230 static int qeth_l2_pm_suspend(struct ccwgroup_device *gdev)
1232 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
1235 netif_device_detach(card->dev);
1236 qeth_set_allowed_threads(card, 0, 1);
1237 wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0);
1238 if (gdev->state == CCWGROUP_OFFLINE)
1240 if (card->state == CARD_STATE_UP) {
1241 if (card->info.hwtrap)
1242 qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM);
1243 __qeth_l2_set_offline(card->gdev, 1);
1245 __qeth_l2_set_offline(card->gdev, 0);
1249 static int qeth_l2_pm_resume(struct ccwgroup_device *gdev)
1251 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
1254 if (gdev->state == CCWGROUP_OFFLINE)
1257 if (card->state == CARD_STATE_RECOVER) {
1258 rc = __qeth_l2_set_online(card->gdev, 1);
1261 dev_close(card->dev);
1265 rc = __qeth_l2_set_online(card->gdev, 0);
1267 qeth_set_allowed_threads(card, 0xffffffff, 0);
1269 netif_device_attach(card->dev);
1271 dev_warn(&card->gdev->dev, "The qeth device driver "
1272 "failed to recover an error on the device\n");
1276 /* Returns zero if the command is successfully "consumed" */
1277 static int qeth_l2_control_event(struct qeth_card *card,
1278 struct qeth_ipa_cmd *cmd)
1280 switch (cmd->hdr.command) {
1281 case IPA_CMD_SETBRIDGEPORT_OSA:
1282 case IPA_CMD_SETBRIDGEPORT_IQD:
1283 if (cmd->data.sbp.hdr.command_code ==
1284 IPA_SBP_BRIDGE_PORT_STATE_CHANGE) {
1285 qeth_bridge_state_change(card, cmd);
1289 case IPA_CMD_ADDRESS_CHANGE_NOTIF:
1290 qeth_bridge_host_event(card, cmd);
1297 struct qeth_discipline qeth_l2_discipline = {
1298 .start_poll = qeth_qdio_start_poll,
1299 .input_handler = (qdio_handler_t *) qeth_qdio_input_handler,
1300 .output_handler = (qdio_handler_t *) qeth_qdio_output_handler,
1301 .recover = qeth_l2_recover,
1302 .setup = qeth_l2_probe_device,
1303 .remove = qeth_l2_remove_device,
1304 .set_online = qeth_l2_set_online,
1305 .set_offline = qeth_l2_set_offline,
1306 .shutdown = qeth_l2_shutdown,
1307 .freeze = qeth_l2_pm_suspend,
1308 .thaw = qeth_l2_pm_resume,
1309 .restore = qeth_l2_pm_resume,
1310 .control_event_handler = qeth_l2_control_event,
1312 EXPORT_SYMBOL_GPL(qeth_l2_discipline);
1314 static int qeth_osn_send_control_data(struct qeth_card *card, int len,
1315 struct qeth_cmd_buffer *iob)
1317 unsigned long flags;
1320 QETH_CARD_TEXT(card, 5, "osndctrd");
1322 wait_event(card->wait_q,
1323 atomic_cmpxchg(&card->write.irq_pending, 0, 1) == 0);
1324 qeth_prepare_control_data(card, len, iob);
1325 QETH_CARD_TEXT(card, 6, "osnoirqp");
1326 spin_lock_irqsave(get_ccwdev_lock(card->write.ccwdev), flags);
1327 rc = ccw_device_start(card->write.ccwdev, &card->write.ccw,
1328 (addr_t) iob, 0, 0);
1329 spin_unlock_irqrestore(get_ccwdev_lock(card->write.ccwdev), flags);
1331 QETH_DBF_MESSAGE(2, "qeth_osn_send_control_data: "
1332 "ccw_device_start rc = %i\n", rc);
1333 QETH_CARD_TEXT_(card, 2, " err%d", rc);
1334 qeth_release_buffer(iob->channel, iob);
1335 atomic_set(&card->write.irq_pending, 0);
1336 wake_up(&card->wait_q);
1341 static int qeth_osn_send_ipa_cmd(struct qeth_card *card,
1342 struct qeth_cmd_buffer *iob, int data_len)
1346 QETH_CARD_TEXT(card, 4, "osndipa");
1348 qeth_prepare_ipa_cmd(card, iob, QETH_PROT_OSN2);
1349 s1 = (u16)(IPA_PDU_HEADER_SIZE + data_len);
1351 memcpy(QETH_IPA_PDU_LEN_TOTAL(iob->data), &s1, 2);
1352 memcpy(QETH_IPA_PDU_LEN_PDU1(iob->data), &s2, 2);
1353 memcpy(QETH_IPA_PDU_LEN_PDU2(iob->data), &s2, 2);
1354 memcpy(QETH_IPA_PDU_LEN_PDU3(iob->data), &s2, 2);
1355 return qeth_osn_send_control_data(card, s1, iob);
1358 int qeth_osn_assist(struct net_device *dev, void *data, int data_len)
1360 struct qeth_cmd_buffer *iob;
1361 struct qeth_card *card;
1366 card = dev->ml_priv;
1369 QETH_CARD_TEXT(card, 2, "osnsdmc");
1370 if (!qeth_card_hw_is_reachable(card))
1372 iob = qeth_wait_for_buffer(&card->write);
1373 memcpy(iob->data+IPA_PDU_HEADER_SIZE, data, data_len);
1374 rc = qeth_osn_send_ipa_cmd(card, iob, data_len);
1377 EXPORT_SYMBOL(qeth_osn_assist);
1379 int qeth_osn_register(unsigned char *read_dev_no, struct net_device **dev,
1380 int (*assist_cb)(struct net_device *, void *),
1381 int (*data_cb)(struct sk_buff *))
1383 struct qeth_card *card;
1385 *dev = qeth_l2_netdev_by_devno(read_dev_no);
1388 card = (*dev)->ml_priv;
1391 QETH_CARD_TEXT(card, 2, "osnreg");
1392 if ((assist_cb == NULL) || (data_cb == NULL))
1394 card->osn_info.assist_cb = assist_cb;
1395 card->osn_info.data_cb = data_cb;
1398 EXPORT_SYMBOL(qeth_osn_register);
1400 void qeth_osn_deregister(struct net_device *dev)
1402 struct qeth_card *card;
1406 card = dev->ml_priv;
1409 QETH_CARD_TEXT(card, 2, "osndereg");
1410 card->osn_info.assist_cb = NULL;
1411 card->osn_info.data_cb = NULL;
1414 EXPORT_SYMBOL(qeth_osn_deregister);
1416 /* SETBRIDGEPORT support, async notifications */
1418 enum qeth_an_event_type {anev_reg_unreg, anev_abort, anev_reset};
1421 * qeth_bridge_emit_host_event() - bridgeport address change notification
1422 * @card: qeth_card structure pointer, for udev events.
1423 * @evtype: "normal" register/unregister, or abort, or reset. For abort
1424 * and reset token and addr_lnid are unused and may be NULL.
1425 * @code: event bitmask: high order bit 0x80 value 1 means removal of an
1426 * object, 0 - addition of an object.
1427 * 0x01 - VLAN, 0x02 - MAC, 0x03 - VLAN and MAC.
1428 * @token: "network token" structure identifying physical address of the port.
1429 * @addr_lnid: pointer to structure with MAC address and VLAN ID.
1431 * This function is called when registrations and deregistrations are
1432 * reported by the hardware, and also when notifications are enabled -
1433 * for all currently registered addresses.
1435 static void qeth_bridge_emit_host_event(struct qeth_card *card,
1436 enum qeth_an_event_type evtype,
1437 u8 code, struct net_if_token *token, struct mac_addr_lnid *addr_lnid)
1444 case anev_reg_unreg:
1445 snprintf(str[i], sizeof(str[i]), "BRIDGEDHOST=%s",
1446 (code & IPA_ADDR_CHANGE_CODE_REMOVAL)
1447 ? "deregister" : "register");
1448 env[i] = str[i]; i++;
1449 if (code & IPA_ADDR_CHANGE_CODE_VLANID) {
1450 snprintf(str[i], sizeof(str[i]), "VLAN=%d",
1452 env[i] = str[i]; i++;
1454 if (code & IPA_ADDR_CHANGE_CODE_MACADDR) {
1455 snprintf(str[i], sizeof(str[i]), "MAC=%pM6",
1457 env[i] = str[i]; i++;
1459 snprintf(str[i], sizeof(str[i]), "NTOK_BUSID=%x.%x.%04x",
1460 token->cssid, token->ssid, token->devnum);
1461 env[i] = str[i]; i++;
1462 snprintf(str[i], sizeof(str[i]), "NTOK_IID=%02x", token->iid);
1463 env[i] = str[i]; i++;
1464 snprintf(str[i], sizeof(str[i]), "NTOK_CHPID=%02x",
1466 env[i] = str[i]; i++;
1467 snprintf(str[i], sizeof(str[i]), "NTOK_CHID=%04x", token->chid);
1468 env[i] = str[i]; i++;
1471 snprintf(str[i], sizeof(str[i]), "BRIDGEDHOST=abort");
1472 env[i] = str[i]; i++;
1475 snprintf(str[i], sizeof(str[i]), "BRIDGEDHOST=reset");
1476 env[i] = str[i]; i++;
1480 kobject_uevent_env(&card->gdev->dev.kobj, KOBJ_CHANGE, env);
1483 struct qeth_bridge_state_data {
1484 struct work_struct worker;
1485 struct qeth_card *card;
1486 struct qeth_sbp_state_change qports;
1489 static void qeth_bridge_state_change_worker(struct work_struct *work)
1491 struct qeth_bridge_state_data *data =
1492 container_of(work, struct qeth_bridge_state_data, worker);
1493 /* We are only interested in the first entry - local port */
1494 struct qeth_sbp_port_entry *entry = &data->qports.entry[0];
1495 char env_locrem[32];
1505 /* Role should not change by itself, but if it did, */
1506 /* information from the hardware is authoritative. */
1507 mutex_lock(&data->card->conf_mutex);
1508 data->card->options.sbp.role = entry->role;
1509 mutex_unlock(&data->card->conf_mutex);
1511 snprintf(env_locrem, sizeof(env_locrem), "BRIDGEPORT=statechange");
1512 snprintf(env_role, sizeof(env_role), "ROLE=%s",
1513 (entry->role == QETH_SBP_ROLE_NONE) ? "none" :
1514 (entry->role == QETH_SBP_ROLE_PRIMARY) ? "primary" :
1515 (entry->role == QETH_SBP_ROLE_SECONDARY) ? "secondary" :
1517 snprintf(env_state, sizeof(env_state), "STATE=%s",
1518 (entry->state == QETH_SBP_STATE_INACTIVE) ? "inactive" :
1519 (entry->state == QETH_SBP_STATE_STANDBY) ? "standby" :
1520 (entry->state == QETH_SBP_STATE_ACTIVE) ? "active" :
1522 kobject_uevent_env(&data->card->gdev->dev.kobj,
1527 static void qeth_bridge_state_change(struct qeth_card *card,
1528 struct qeth_ipa_cmd *cmd)
1530 struct qeth_sbp_state_change *qports =
1531 &cmd->data.sbp.data.state_change;
1532 struct qeth_bridge_state_data *data;
1535 QETH_CARD_TEXT(card, 2, "brstchng");
1536 if (qports->entry_length != sizeof(struct qeth_sbp_port_entry)) {
1537 QETH_CARD_TEXT_(card, 2, "BPsz%04x", qports->entry_length);
1540 extrasize = sizeof(struct qeth_sbp_port_entry) * qports->num_entries;
1541 data = kzalloc(sizeof(struct qeth_bridge_state_data) + extrasize,
1544 QETH_CARD_TEXT(card, 2, "BPSalloc");
1547 INIT_WORK(&data->worker, qeth_bridge_state_change_worker);
1549 memcpy(&data->qports, qports,
1550 sizeof(struct qeth_sbp_state_change) + extrasize);
1551 queue_work(qeth_wq, &data->worker);
1554 struct qeth_bridge_host_data {
1555 struct work_struct worker;
1556 struct qeth_card *card;
1557 struct qeth_ipacmd_addr_change hostevs;
1560 static void qeth_bridge_host_event_worker(struct work_struct *work)
1562 struct qeth_bridge_host_data *data =
1563 container_of(work, struct qeth_bridge_host_data, worker);
1566 if (data->hostevs.lost_event_mask) {
1567 dev_info(&data->card->gdev->dev,
1568 "Address notification from the Bridge Port stopped %s (%s)\n",
1569 data->card->dev->name,
1570 (data->hostevs.lost_event_mask == 0x01)
1572 : (data->hostevs.lost_event_mask == 0x02)
1573 ? "Bridge port state change"
1574 : "Unknown reason");
1575 mutex_lock(&data->card->conf_mutex);
1576 data->card->options.sbp.hostnotification = 0;
1577 mutex_unlock(&data->card->conf_mutex);
1578 qeth_bridge_emit_host_event(data->card, anev_abort,
1581 for (i = 0; i < data->hostevs.num_entries; i++) {
1582 struct qeth_ipacmd_addr_change_entry *entry =
1583 &data->hostevs.entry[i];
1584 qeth_bridge_emit_host_event(data->card,
1587 &entry->token, &entry->addr_lnid);
1592 static void qeth_bridge_host_event(struct qeth_card *card,
1593 struct qeth_ipa_cmd *cmd)
1595 struct qeth_ipacmd_addr_change *hostevs =
1596 &cmd->data.addrchange;
1597 struct qeth_bridge_host_data *data;
1600 QETH_CARD_TEXT(card, 2, "brhostev");
1601 if (cmd->hdr.return_code != 0x0000) {
1602 if (cmd->hdr.return_code == 0x0010) {
1603 if (hostevs->lost_event_mask == 0x00)
1604 hostevs->lost_event_mask = 0xff;
1606 QETH_CARD_TEXT_(card, 2, "BPHe%04x",
1607 cmd->hdr.return_code);
1611 extrasize = sizeof(struct qeth_ipacmd_addr_change_entry) *
1612 hostevs->num_entries;
1613 data = kzalloc(sizeof(struct qeth_bridge_host_data) + extrasize,
1616 QETH_CARD_TEXT(card, 2, "BPHalloc");
1619 INIT_WORK(&data->worker, qeth_bridge_host_event_worker);
1621 memcpy(&data->hostevs, hostevs,
1622 sizeof(struct qeth_ipacmd_addr_change) + extrasize);
1623 queue_work(qeth_wq, &data->worker);
1626 /* SETBRIDGEPORT support; sending commands */
1628 struct _qeth_sbp_cbctl {
1634 enum qeth_sbp_roles *role;
1635 enum qeth_sbp_states *state;
1641 * qeth_bridgeport_makerc() - derive "traditional" error from hardware codes.
1642 * @card: qeth_card structure pointer, for debug messages.
1643 * @cbctl: state structure with hardware return codes.
1644 * @setcmd: IPA command code
1646 * Returns negative errno-compatible error indication or 0 on success.
1648 static int qeth_bridgeport_makerc(struct qeth_card *card,
1649 struct _qeth_sbp_cbctl *cbctl, enum qeth_ipa_sbp_cmd setcmd)
1652 int is_iqd = (card->info.type == QETH_CARD_TYPE_IQD);
1654 if ((is_iqd && (cbctl->ipa_rc == IPA_RC_SUCCESS)) ||
1655 (!is_iqd && (cbctl->ipa_rc == cbctl->cmd_rc)))
1656 switch (cbctl->cmd_rc) {
1665 case 0x000C: /* Not configured as bridge Port */
1666 rc = -ENODEV; /* maybe not the best code here? */
1667 dev_err(&card->gdev->dev,
1668 "The device is not configured as a Bridge Port\n");
1671 case 0x0014: /* Another device is Primary */
1673 case IPA_SBP_SET_PRIMARY_BRIDGE_PORT:
1675 dev_err(&card->gdev->dev,
1676 "The LAN already has a primary Bridge Port\n");
1678 case IPA_SBP_SET_SECONDARY_BRIDGE_PORT:
1680 dev_err(&card->gdev->dev,
1681 "The device is already a primary Bridge Port\n");
1688 case 0x0018: /* This device is currently Secondary */
1690 dev_err(&card->gdev->dev,
1691 "The device is already a secondary Bridge Port\n");
1694 case 0x001C: /* Limit for Secondary devices reached */
1696 dev_err(&card->gdev->dev,
1697 "The LAN cannot have more secondary Bridge Ports\n");
1700 case 0x0024: /* This device is currently Primary */
1702 dev_err(&card->gdev->dev,
1703 "The device is already a primary Bridge Port\n");
1706 case 0x0020: /* Not authorized by zManager */
1708 dev_err(&card->gdev->dev,
1709 "The device is not authorized to be a Bridge Port\n");
1715 switch (cbctl->ipa_rc) {
1716 case IPA_RC_NOTSUPP:
1719 case IPA_RC_UNSUPPORTED_COMMAND:
1727 QETH_CARD_TEXT_(card, 2, "SBPi%04x", cbctl->ipa_rc);
1728 QETH_CARD_TEXT_(card, 2, "SBPc%04x", cbctl->cmd_rc);
1733 static inline int ipa_cmd_sbp(struct qeth_card *card)
1735 return (card->info.type == QETH_CARD_TYPE_IQD) ?
1736 IPA_CMD_SETBRIDGEPORT_IQD :
1737 IPA_CMD_SETBRIDGEPORT_OSA;
1740 static int qeth_bridgeport_query_support_cb(struct qeth_card *card,
1741 struct qeth_reply *reply, unsigned long data)
1743 struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
1744 struct _qeth_sbp_cbctl *cbctl = (struct _qeth_sbp_cbctl *)reply->param;
1745 QETH_CARD_TEXT(card, 2, "brqsupcb");
1746 cbctl->ipa_rc = cmd->hdr.return_code;
1747 cbctl->cmd_rc = cmd->data.sbp.hdr.return_code;
1748 if ((cbctl->ipa_rc == 0) && (cbctl->cmd_rc == 0)) {
1749 cbctl->data.supported =
1750 cmd->data.sbp.data.query_cmds_supp.supported_cmds;
1752 cbctl->data.supported = 0;
1758 * qeth_bridgeport_query_support() - store bitmask of supported subfunctions.
1759 * @card: qeth_card structure pointer.
1761 * Sets bitmask of supported setbridgeport subfunctions in the qeth_card
1762 * strucutre: card->options.sbp.supported_funcs.
1764 static void qeth_bridgeport_query_support(struct qeth_card *card)
1766 struct qeth_cmd_buffer *iob;
1767 struct qeth_ipa_cmd *cmd;
1768 struct _qeth_sbp_cbctl cbctl;
1770 QETH_CARD_TEXT(card, 2, "brqsuppo");
1771 iob = qeth_get_ipacmd_buffer(card, ipa_cmd_sbp(card), 0);
1774 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
1775 cmd->data.sbp.hdr.cmdlength =
1776 sizeof(struct qeth_ipacmd_sbp_hdr) +
1777 sizeof(struct qeth_sbp_query_cmds_supp);
1778 cmd->data.sbp.hdr.command_code =
1779 IPA_SBP_QUERY_COMMANDS_SUPPORTED;
1780 cmd->data.sbp.hdr.used_total = 1;
1781 cmd->data.sbp.hdr.seq_no = 1;
1782 if (qeth_send_ipa_cmd(card, iob, qeth_bridgeport_query_support_cb,
1784 qeth_bridgeport_makerc(card, &cbctl,
1785 IPA_SBP_QUERY_COMMANDS_SUPPORTED)) {
1786 /* non-zero makerc signifies failure, and produce messages */
1787 card->options.sbp.role = QETH_SBP_ROLE_NONE;
1790 card->options.sbp.supported_funcs = cbctl.data.supported;
1793 static int qeth_bridgeport_query_ports_cb(struct qeth_card *card,
1794 struct qeth_reply *reply, unsigned long data)
1796 struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
1797 struct qeth_sbp_query_ports *qports = &cmd->data.sbp.data.query_ports;
1798 struct _qeth_sbp_cbctl *cbctl = (struct _qeth_sbp_cbctl *)reply->param;
1800 QETH_CARD_TEXT(card, 2, "brqprtcb");
1801 cbctl->ipa_rc = cmd->hdr.return_code;
1802 cbctl->cmd_rc = cmd->data.sbp.hdr.return_code;
1803 if ((cbctl->ipa_rc != 0) || (cbctl->cmd_rc != 0))
1805 if (qports->entry_length != sizeof(struct qeth_sbp_port_entry)) {
1806 cbctl->cmd_rc = 0xffff;
1807 QETH_CARD_TEXT_(card, 2, "SBPs%04x", qports->entry_length);
1810 /* first entry contains the state of the local port */
1811 if (qports->num_entries > 0) {
1812 if (cbctl->data.qports.role)
1813 *cbctl->data.qports.role = qports->entry[0].role;
1814 if (cbctl->data.qports.state)
1815 *cbctl->data.qports.state = qports->entry[0].state;
1821 * qeth_bridgeport_query_ports() - query local bridgeport status.
1822 * @card: qeth_card structure pointer.
1823 * @role: Role of the port: 0-none, 1-primary, 2-secondary.
1824 * @state: State of the port: 0-inactive, 1-standby, 2-active.
1826 * Returns negative errno-compatible error indication or 0 on success.
1828 * 'role' and 'state' are not updated in case of hardware operation failure.
1830 int qeth_bridgeport_query_ports(struct qeth_card *card,
1831 enum qeth_sbp_roles *role, enum qeth_sbp_states *state)
1834 struct qeth_cmd_buffer *iob;
1835 struct qeth_ipa_cmd *cmd;
1836 struct _qeth_sbp_cbctl cbctl = {
1845 QETH_CARD_TEXT(card, 2, "brqports");
1846 if (!(card->options.sbp.supported_funcs & IPA_SBP_QUERY_BRIDGE_PORTS))
1848 iob = qeth_get_ipacmd_buffer(card, ipa_cmd_sbp(card), 0);
1851 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
1852 cmd->data.sbp.hdr.cmdlength =
1853 sizeof(struct qeth_ipacmd_sbp_hdr);
1854 cmd->data.sbp.hdr.command_code =
1855 IPA_SBP_QUERY_BRIDGE_PORTS;
1856 cmd->data.sbp.hdr.used_total = 1;
1857 cmd->data.sbp.hdr.seq_no = 1;
1858 rc = qeth_send_ipa_cmd(card, iob, qeth_bridgeport_query_ports_cb,
1862 return qeth_bridgeport_makerc(card, &cbctl, IPA_SBP_QUERY_BRIDGE_PORTS);
1864 EXPORT_SYMBOL_GPL(qeth_bridgeport_query_ports);
1866 static int qeth_bridgeport_set_cb(struct qeth_card *card,
1867 struct qeth_reply *reply, unsigned long data)
1869 struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *)data;
1870 struct _qeth_sbp_cbctl *cbctl = (struct _qeth_sbp_cbctl *)reply->param;
1871 QETH_CARD_TEXT(card, 2, "brsetrcb");
1872 cbctl->ipa_rc = cmd->hdr.return_code;
1873 cbctl->cmd_rc = cmd->data.sbp.hdr.return_code;
1878 * qeth_bridgeport_setrole() - Assign primary role to the port.
1879 * @card: qeth_card structure pointer.
1880 * @role: Role to assign.
1882 * Returns negative errno-compatible error indication or 0 on success.
1884 int qeth_bridgeport_setrole(struct qeth_card *card, enum qeth_sbp_roles role)
1888 struct qeth_cmd_buffer *iob;
1889 struct qeth_ipa_cmd *cmd;
1890 struct _qeth_sbp_cbctl cbctl;
1891 enum qeth_ipa_sbp_cmd setcmd;
1893 QETH_CARD_TEXT(card, 2, "brsetrol");
1895 case QETH_SBP_ROLE_NONE:
1896 setcmd = IPA_SBP_RESET_BRIDGE_PORT_ROLE;
1897 cmdlength = sizeof(struct qeth_ipacmd_sbp_hdr) +
1898 sizeof(struct qeth_sbp_reset_role);
1900 case QETH_SBP_ROLE_PRIMARY:
1901 setcmd = IPA_SBP_SET_PRIMARY_BRIDGE_PORT;
1902 cmdlength = sizeof(struct qeth_ipacmd_sbp_hdr) +
1903 sizeof(struct qeth_sbp_set_primary);
1905 case QETH_SBP_ROLE_SECONDARY:
1906 setcmd = IPA_SBP_SET_SECONDARY_BRIDGE_PORT;
1907 cmdlength = sizeof(struct qeth_ipacmd_sbp_hdr) +
1908 sizeof(struct qeth_sbp_set_secondary);
1913 if (!(card->options.sbp.supported_funcs & setcmd))
1915 iob = qeth_get_ipacmd_buffer(card, ipa_cmd_sbp(card), 0);
1918 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
1919 cmd->data.sbp.hdr.cmdlength = cmdlength;
1920 cmd->data.sbp.hdr.command_code = setcmd;
1921 cmd->data.sbp.hdr.used_total = 1;
1922 cmd->data.sbp.hdr.seq_no = 1;
1923 rc = qeth_send_ipa_cmd(card, iob, qeth_bridgeport_set_cb,
1927 return qeth_bridgeport_makerc(card, &cbctl, setcmd);
1931 * qeth_anset_makerc() - derive "traditional" error from hardware codes.
1932 * @card: qeth_card structure pointer, for debug messages.
1934 * Returns negative errno-compatible error indication or 0 on success.
1936 static int qeth_anset_makerc(struct qeth_card *card, int pnso_rc, u16 response)
1949 dev_err(&card->gdev->dev,
1950 "Setting address notification failed\n");
1962 QETH_CARD_TEXT_(card, 2, "SBPp%04x", pnso_rc);
1963 QETH_CARD_TEXT_(card, 2, "SBPr%04x", response);
1968 static void qeth_bridgeport_an_set_cb(void *priv,
1969 enum qdio_brinfo_entry_type type, void *entry)
1971 struct qeth_card *card = (struct qeth_card *)priv;
1972 struct qdio_brinfo_entry_l2 *l2entry;
1975 if (type != l2_addr_lnid) {
1980 l2entry = (struct qdio_brinfo_entry_l2 *)entry;
1981 code = IPA_ADDR_CHANGE_CODE_MACADDR;
1982 if (l2entry->addr_lnid.lnid)
1983 code |= IPA_ADDR_CHANGE_CODE_VLANID;
1984 qeth_bridge_emit_host_event(card, anev_reg_unreg, code,
1985 (struct net_if_token *)&l2entry->nit,
1986 (struct mac_addr_lnid *)&l2entry->addr_lnid);
1990 * qeth_bridgeport_an_set() - Enable or disable bridgeport address notification
1991 * @card: qeth_card structure pointer.
1992 * @enable: 0 - disable, non-zero - enable notifications
1994 * Returns negative errno-compatible error indication or 0 on success.
1996 * On enable, emits a series of address notifications udev events for all
1997 * currently registered hosts.
1999 int qeth_bridgeport_an_set(struct qeth_card *card, int enable)
2003 struct ccw_device *ddev;
2004 struct subchannel_id schid;
2008 if (!card->options.sbp.supported_funcs)
2010 ddev = CARD_DDEV(card);
2011 ccw_device_get_schid(ddev, &schid);
2014 qeth_bridge_emit_host_event(card, anev_reset, 0, NULL, NULL);
2015 rc = qdio_pnso_brinfo(schid, 1, &response,
2016 qeth_bridgeport_an_set_cb, card);
2018 rc = qdio_pnso_brinfo(schid, 0, &response, NULL, NULL);
2019 return qeth_anset_makerc(card, rc, response);
2021 EXPORT_SYMBOL_GPL(qeth_bridgeport_an_set);
2023 module_init(qeth_l2_init);
2024 module_exit(qeth_l2_exit);
2025 MODULE_AUTHOR("Frank Blaschka <frank.blaschka@de.ibm.com>");
2026 MODULE_DESCRIPTION("qeth layer 2 discipline");
2027 MODULE_LICENSE("GPL");