int qeth_send_control_data(struct qeth_card *, int, struct qeth_cmd_buffer *,
        int (*reply_cb)(struct qeth_card *, struct qeth_reply*, unsigned long),
        void *reply_param);
-int qeth_get_cast_type(struct qeth_card *, struct sk_buff *);
 int qeth_get_priority_queue(struct qeth_card *, struct sk_buff *, int, int);
 int qeth_get_elements_no(struct qeth_card *, void *, struct sk_buff *, int);
 int qeth_do_send_packet_fast(struct qeth_card *, struct qeth_qdio_out_q *,
 
 }
 EXPORT_SYMBOL_GPL(qeth_qdio_output_handler);
 
-int qeth_get_cast_type(struct qeth_card *card, struct sk_buff *skb)
-{
-       int cast_type = RTN_UNSPEC;
-
-       if (card->info.type == QETH_CARD_TYPE_OSN)
-               return cast_type;
-
-       if (skb_dst(skb) && skb_dst(skb)->neighbour) {
-               cast_type = skb_dst(skb)->neighbour->type;
-               if ((cast_type == RTN_BROADCAST) ||
-                   (cast_type == RTN_MULTICAST) ||
-                   (cast_type == RTN_ANYCAST))
-                       return cast_type;
-               else
-                       return RTN_UNSPEC;
-       }
-       /* try something else */
-       if (skb->protocol == ETH_P_IPV6)
-               return (skb_network_header(skb)[24] == 0xff) ?
-                               RTN_MULTICAST : 0;
-       else if (skb->protocol == ETH_P_IP)
-               return ((skb_network_header(skb)[16] & 0xf0) == 0xe0) ?
-                               RTN_MULTICAST : 0;
-       /* ... */
-       if (!memcmp(skb->data, skb->dev->broadcast, 6))
-               return RTN_BROADCAST;
-       else {
-               u16 hdr_mac;
-
-               hdr_mac = *((u16 *)skb->data);
-               /* tr multicast? */
-               switch (card->info.link_type) {
-               case QETH_LINK_TYPE_HSTR:
-               case QETH_LINK_TYPE_LANE_TR:
-                       if ((hdr_mac == QETH_TR_MAC_NC) ||
-                           (hdr_mac == QETH_TR_MAC_C))
-                               return RTN_MULTICAST;
-                       break;
-               /* eth or so multicast? */
-               default:
-               if ((hdr_mac == QETH_ETH_MAC_V4) ||
-                           (hdr_mac == QETH_ETH_MAC_V6))
-                               return RTN_MULTICAST;
-               }
-       }
-       return cast_type;
-}
-EXPORT_SYMBOL_GPL(qeth_get_cast_type);
-
 int qeth_get_priority_queue(struct qeth_card *card, struct sk_buff *skb,
                        int ipv, int cast_type)
 {
 
        spin_unlock_bh(&card->mclock);
 }
 
-static void qeth_l2_get_packet_type(struct qeth_card *card,
-                       struct qeth_hdr *hdr, struct sk_buff *skb)
+static inline int qeth_l2_get_cast_type(struct qeth_card *card,
+                       struct sk_buff *skb)
 {
-       __u16 hdr_mac;
-
-       if (!memcmp(skb->data + QETH_HEADER_SIZE,
-                   skb->dev->broadcast, 6)) {
-               /* broadcast? */
-               hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_BROADCAST;
-               return;
-       }
-       hdr_mac = *((__u16 *)skb->data);
-       /* tr multicast? */
-       switch (card->info.link_type) {
-       case QETH_LINK_TYPE_HSTR:
-       case QETH_LINK_TYPE_LANE_TR:
-               if ((hdr_mac == QETH_TR_MAC_NC) ||
-                   (hdr_mac == QETH_TR_MAC_C))
-                       hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_MULTICAST;
-               else
-                       hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_UNICAST;
-               break;
-               /* eth or so multicast? */
-       default:
-               if ((hdr_mac == QETH_ETH_MAC_V4) ||
-                    (hdr_mac == QETH_ETH_MAC_V6))
-                       hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_MULTICAST;
-               else
-                       hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_UNICAST;
-       }
+       if (card->info.type == QETH_CARD_TYPE_OSN)
+               return RTN_UNSPEC;
+       if (is_broadcast_ether_addr(skb->data))
+               return RTN_BROADCAST;
+       if (is_multicast_ether_addr(skb->data))
+               return RTN_MULTICAST;
+       return RTN_UNSPEC;
 }
 
 static void qeth_l2_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
        else if (cast_type == RTN_BROADCAST)
                hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_BROADCAST;
        else
-               qeth_l2_get_packet_type(card, hdr, skb);
+               hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_UNICAST;
 
        hdr->hdr.l2.pkt_length = skb->len-QETH_HEADER_SIZE;
        /* VSWITCH relies on the VLAN
        struct qeth_card *card = dev->ml_priv;
        struct sk_buff *new_skb = skb;
        int ipv = qeth_get_ip_version(skb);
-       int cast_type = qeth_get_cast_type(card, skb);
+       int cast_type = qeth_l2_get_cast_type(card, skb);
        struct qeth_qdio_out_q *queue = card->qdio.out_qs
                [qeth_get_priority_queue(card, skb, ipv, cast_type)];
        int tx_bytes = skb->len;
 
        return rc;
 }
 
+int inline qeth_l3_get_cast_type(struct qeth_card *card, struct sk_buff *skb)
+{
+       int cast_type = RTN_UNSPEC;
+
+       if (skb_dst(skb) && skb_dst(skb)->neighbour) {
+               cast_type = skb_dst(skb)->neighbour->type;
+               if ((cast_type == RTN_BROADCAST) ||
+                   (cast_type == RTN_MULTICAST) ||
+                   (cast_type == RTN_ANYCAST))
+                       return cast_type;
+               else
+                       return RTN_UNSPEC;
+       }
+       /* try something else */
+       if (skb->protocol == ETH_P_IPV6)
+               return (skb_network_header(skb)[24] == 0xff) ?
+                               RTN_MULTICAST : 0;
+       else if (skb->protocol == ETH_P_IP)
+               return ((skb_network_header(skb)[16] & 0xf0) == 0xe0) ?
+                               RTN_MULTICAST : 0;
+       /* ... */
+       if (!memcmp(skb->data, skb->dev->broadcast, 6))
+               return RTN_BROADCAST;
+       else {
+               u16 hdr_mac;
+
+               hdr_mac = *((u16 *)skb->data);
+               /* tr multicast? */
+               switch (card->info.link_type) {
+               case QETH_LINK_TYPE_HSTR:
+               case QETH_LINK_TYPE_LANE_TR:
+                       if ((hdr_mac == QETH_TR_MAC_NC) ||
+                           (hdr_mac == QETH_TR_MAC_C))
+                               return RTN_MULTICAST;
+                       break;
+               /* eth or so multicast? */
+               default:
+               if ((hdr_mac == QETH_ETH_MAC_V4) ||
+                           (hdr_mac == QETH_ETH_MAC_V6))
+                               return RTN_MULTICAST;
+               }
+       }
+       return cast_type;
+}
+
 static void qeth_l3_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
                struct sk_buff *skb, int ipv, int cast_type)
 {
        struct qeth_card *card = dev->ml_priv;
        struct sk_buff *new_skb = NULL;
        int ipv = qeth_get_ip_version(skb);
-       int cast_type = qeth_get_cast_type(card, skb);
+       int cast_type = qeth_l3_get_cast_type(card, skb);
        struct qeth_qdio_out_q *queue = card->qdio.out_qs
                [qeth_get_priority_queue(card, skb, ipv, cast_type)];
        int tx_bytes = skb->len;