int in_buf_size;
 
        /* output */
-       int no_out_queues;
+       unsigned int no_out_queues;
        struct qeth_qdio_out_q *out_qs[QETH_MAX_OUT_QUEUES];
        struct qdio_outbuf_state *out_bufstates;
 
 
 struct qeth_priv {
        unsigned int rx_copybreak;
+       unsigned int tx_wanted_queues;
        u32 brport_hw_features;
        u32 brport_features;
 };
 /*some helper functions*/
 #define QETH_CARD_IFNAME(card) (((card)->dev)? (card)->dev->name : "")
 
+static inline unsigned int qeth_tx_actual_queues(struct qeth_card *card)
+{
+       struct qeth_priv *priv = netdev_priv(card->dev);
+
+       return min(priv->tx_wanted_queues, card->qdio.no_out_queues);
+}
+
 static inline u16 qeth_iqd_translate_txq(struct net_device *dev, u16 txq)
 {
        if (txq == QETH_IQD_MCAST_TXQ)
 int qeth_configure_cq(struct qeth_card *, enum qeth_cq);
 int qeth_hw_trap(struct qeth_card *, enum qeth_diags_trap_action);
 int qeth_setassparms_cb(struct qeth_card *, struct qeth_reply *, unsigned long);
-int qeth_setup_netdev(struct qeth_card *card);
 int qeth_set_features(struct net_device *, netdev_features_t);
 void qeth_enable_hw_features(struct net_device *dev);
 netdev_features_t qeth_fix_features(struct net_device *, netdev_features_t);
 
        }
 }
 
-static int qeth_osa_set_output_queues(struct qeth_card *card, bool single)
+static void qeth_osa_set_output_queues(struct qeth_card *card, bool single)
 {
        unsigned int max = single ? 1 : card->dev->num_tx_queues;
-       unsigned int count;
-       int rc;
-
-       count = IS_VM_NIC(card) ? min(max, card->dev->real_num_tx_queues) : max;
-
-       rtnl_lock();
-       rc = netif_set_real_num_tx_queues(card->dev, count);
-       rtnl_unlock();
-
-       if (rc)
-               return rc;
 
        if (card->qdio.no_out_queues == max)
-               return 0;
+               return;
 
        if (atomic_read(&card->qdio.state) != QETH_QDIO_UNINITIALIZED)
                qeth_free_qdio_queues(card);
                dev_info(&card->gdev->dev, "Priority Queueing not supported\n");
 
        card->qdio.no_out_queues = max;
-       return 0;
 }
 
 static int qeth_update_from_chp_desc(struct qeth_card *card)
 {
        struct ccw_device *ccwdev;
        struct channel_path_desc_fmt0 *chp_dsc;
-       int rc = 0;
 
        QETH_CARD_TEXT(card, 2, "chp_desc");
 
 
        if (IS_OSD(card) || IS_OSX(card))
                /* CHPP field bit 6 == 1 -> single queue */
-               rc = qeth_osa_set_output_queues(card, chp_dsc->chpp & 0x02);
+               qeth_osa_set_output_queues(card, chp_dsc->chpp & 0x02);
 
        kfree(chp_dsc);
        QETH_CARD_TEXT_(card, 2, "nr:%x", card->qdio.no_out_queues);
        QETH_CARD_TEXT_(card, 2, "lvl:%02x", card->info.func_level);
-       return rc;
+       return 0;
 }
 
 static void qeth_init_qdio_info(struct qeth_card *card)
 
        qeth_print_status_message(card);
 
+       if (card->dev->reg_state != NETREG_REGISTERED) {
+               struct qeth_priv *priv = netdev_priv(card->dev);
+
+               if (IS_IQD(card))
+                       priv->tx_wanted_queues = QETH_IQD_MIN_TXQ;
+               else if (IS_VM_NIC(card))
+                       priv->tx_wanted_queues = 1;
+               else
+                       priv->tx_wanted_queues = card->dev->num_tx_queues;
+
+               /* no need for locking / error handling at this early stage: */
+               qeth_set_real_num_tx_queues(card, qeth_tx_actual_queues(card));
+       }
+
        rc = card->discipline->set_online(card, carrier_ok);
        if (rc)
                goto err_online;
        SET_NETDEV_DEV(dev, &card->gdev->dev);
        netif_carrier_off(dev);
 
-       dev->ethtool_ops = IS_OSN(card) ? &qeth_osn_ethtool_ops :
-                                         &qeth_ethtool_ops;
+       if (IS_OSN(card)) {
+               dev->ethtool_ops = &qeth_osn_ethtool_ops;
+       } else {
+               dev->ethtool_ops = &qeth_ethtool_ops;
+               dev->priv_flags &= ~IFF_TX_SKB_SHARING;
+               dev->hw_features |= NETIF_F_SG;
+               dev->vlan_features |= NETIF_F_SG;
+               if (IS_IQD(card))
+                       dev->features |= NETIF_F_SG;
+       }
 
        return dev;
 }
        return clone;
 }
 
-int qeth_setup_netdev(struct qeth_card *card)
-{
-       struct net_device *dev = card->dev;
-       unsigned int num_tx_queues;
-
-       dev->priv_flags &= ~IFF_TX_SKB_SHARING;
-       dev->hw_features |= NETIF_F_SG;
-       dev->vlan_features |= NETIF_F_SG;
-
-       if (IS_IQD(card)) {
-               dev->features |= NETIF_F_SG;
-               num_tx_queues = QETH_IQD_MIN_TXQ;
-       } else if (IS_VM_NIC(card)) {
-               num_tx_queues = 1;
-       } else {
-               num_tx_queues = dev->real_num_tx_queues;
-       }
-
-       return qeth_set_real_num_tx_queues(card, num_tx_queues);
-}
-EXPORT_SYMBOL_GPL(qeth_setup_netdev);
-
 static int qeth_core_probe_device(struct ccwgroup_device *gdev)
 {
        struct qeth_card *card;
 
        return rc;
 }
+EXPORT_SYMBOL_GPL(qeth_set_real_num_tx_queues);
 
 u16 qeth_iqd_select_queue(struct net_device *dev, struct sk_buff *skb,
                          u8 cast_type, struct net_device *sb_dev)