]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/s390/net/qeth_l2_main.c
s390/qeth: use correct return type for hard_start_xmit()
[karo-tx-linux.git] / drivers / s390 / net / qeth_l2_main.c
index bea483307618996240cb90cc3382950ab8b38354..11cf4a4b36a63a9d390fc9b75e3474865cd3432d 100644 (file)
@@ -16,7 +16,6 @@
 #include <linux/kernel.h>
 #include <linux/slab.h>
 #include <linux/etherdevice.h>
-#include <linux/mii.h>
 #include <linux/ip.h>
 #include <linux/list.h>
 #include <linux/hash.h>
 static int qeth_l2_set_offline(struct ccwgroup_device *);
 static int qeth_l2_stop(struct net_device *);
 static void qeth_l2_set_rx_mode(struct net_device *);
-static int qeth_l2_recover(void *);
 static void qeth_bridgeport_query_support(struct qeth_card *card);
 static void qeth_bridge_state_change(struct qeth_card *card,
                                        struct qeth_ipa_cmd *cmd);
 static void qeth_bridge_host_event(struct qeth_card *card,
                                        struct qeth_ipa_cmd *cmd);
 
-static int qeth_l2_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
-{
-       struct qeth_card *card = dev->ml_priv;
-       struct mii_ioctl_data *mii_data;
-       int rc = 0;
-
-       if (!card)
-               return -ENODEV;
-
-       if (!qeth_card_hw_is_reachable(card))
-               return -ENODEV;
-
-       if (card->info.type == QETH_CARD_TYPE_OSN)
-               return -EPERM;
-
-       switch (cmd) {
-       case SIOC_QETH_ADP_SET_SNMP_CONTROL:
-               rc = qeth_snmp_command(card, rq->ifr_ifru.ifru_data);
-               break;
-       case SIOC_QETH_GET_CARD_TYPE:
-               if ((card->info.type == QETH_CARD_TYPE_OSD ||
-                    card->info.type == QETH_CARD_TYPE_OSM ||
-                    card->info.type == QETH_CARD_TYPE_OSX) &&
-                   !card->info.guestlan)
-                       return 1;
-               return 0;
-               break;
-       case SIOCGMIIPHY:
-               mii_data = if_mii(rq);
-               mii_data->phy_id = 0;
-               break;
-       case SIOCGMIIREG:
-               mii_data = if_mii(rq);
-               if (mii_data->phy_id != 0)
-                       rc = -EINVAL;
-               else
-                       mii_data->val_out = qeth_mdio_read(dev,
-                               mii_data->phy_id, mii_data->reg_num);
-               break;
-       case SIOC_QETH_QUERY_OAT:
-               rc = qeth_query_oat_command(card, rq->ifr_ifru.ifru_data);
-               break;
-       default:
-               rc = -EOPNOTSUPP;
-       }
-       if (rc)
-               QETH_CARD_TEXT_(card, 2, "ioce%d", rc);
-       return rc;
-}
-
 static int qeth_l2_verify_dev(struct net_device *dev)
 {
        struct qeth_card *card;
@@ -552,81 +500,6 @@ static int qeth_l2_process_inbound_buffer(struct qeth_card *card,
        return work_done;
 }
 
-static int qeth_l2_poll(struct napi_struct *napi, int budget)
-{
-       struct qeth_card *card = container_of(napi, struct qeth_card, napi);
-       int work_done = 0;
-       struct qeth_qdio_buffer *buffer;
-       int done;
-       int new_budget = budget;
-
-       if (card->options.performance_stats) {
-               card->perf_stats.inbound_cnt++;
-               card->perf_stats.inbound_start_time = qeth_get_micros();
-       }
-
-       while (1) {
-               if (!card->rx.b_count) {
-                       card->rx.qdio_err = 0;
-                       card->rx.b_count = qdio_get_next_buffers(
-                               card->data.ccwdev, 0, &card->rx.b_index,
-                               &card->rx.qdio_err);
-                       if (card->rx.b_count <= 0) {
-                               card->rx.b_count = 0;
-                               break;
-                       }
-                       card->rx.b_element =
-                               &card->qdio.in_q->bufs[card->rx.b_index]
-                               .buffer->element[0];
-                       card->rx.e_offset = 0;
-               }
-
-               while (card->rx.b_count) {
-                       buffer = &card->qdio.in_q->bufs[card->rx.b_index];
-                       if (!(card->rx.qdio_err &&
-                           qeth_check_qdio_errors(card, buffer->buffer,
-                           card->rx.qdio_err, "qinerr")))
-                               work_done += qeth_l2_process_inbound_buffer(
-                                       card, new_budget, &done);
-                       else
-                               done = 1;
-
-                       if (done) {
-                               if (card->options.performance_stats)
-                                       card->perf_stats.bufs_rec++;
-                               qeth_put_buffer_pool_entry(card,
-                                       buffer->pool_entry);
-                               qeth_queue_input_buffer(card, card->rx.b_index);
-                               card->rx.b_count--;
-                               if (card->rx.b_count) {
-                                       card->rx.b_index =
-                                               (card->rx.b_index + 1) %
-                                               QDIO_MAX_BUFFERS_PER_Q;
-                                       card->rx.b_element =
-                                               &card->qdio.in_q
-                                               ->bufs[card->rx.b_index]
-                                               .buffer->element[0];
-                                       card->rx.e_offset = 0;
-                               }
-                       }
-
-                       if (work_done >= budget)
-                               goto out;
-                       else
-                               new_budget = budget - work_done;
-               }
-       }
-
-       napi_complete(napi);
-       if (qdio_start_irq(card->data.ccwdev, 0))
-               napi_schedule(&card->napi);
-out:
-       if (card->options.performance_stats)
-               card->perf_stats.inbound_time += qeth_get_micros() -
-                       card->perf_stats.inbound_start_time;
-       return work_done;
-}
-
 static int qeth_l2_request_initial_mac(struct qeth_card *card)
 {
        int rc = 0;
@@ -808,7 +681,8 @@ static void qeth_l2_set_rx_mode(struct net_device *dev)
                qeth_promisc_to_bridge(card);
 }
 
-static int qeth_l2_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
+static netdev_tx_t qeth_l2_hard_start_xmit(struct sk_buff *skb,
+                                          struct net_device *dev)
 {
        int rc;
        struct qeth_hdr *hdr = NULL;
@@ -849,7 +723,7 @@ static int qeth_l2_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
         * chaining we can not send long frag lists
         */
        if ((card->info.type != QETH_CARD_TYPE_IQD) &&
-           !qeth_get_elements_no(card, new_skb, 0)) {
+           !qeth_get_elements_no(card, new_skb, 0, 0)) {
                int lin_rc = skb_linearize(new_skb);
 
                if (card->options.performance_stats) {
@@ -894,7 +768,8 @@ static int qeth_l2_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
                }
        }
 
-       elements = qeth_get_elements_no(card, new_skb, elements_needed);
+       elements = qeth_get_elements_no(card, new_skb, elements_needed,
+                                       (data_offset > 0) ? data_offset : 0);
        if (!elements) {
                if (data_offset >= 0)
                        kmem_cache_free(qeth_core_header_cache, hdr);
@@ -909,7 +784,7 @@ static int qeth_l2_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
                                         elements);
        } else
                rc = qeth_do_send_packet_fast(card, queue, new_skb, hdr,
-                                       elements, data_offset, hd_len);
+                                             data_offset, hd_len);
        if (!rc) {
                card->stats.tx_packets++;
                card->stats.tx_bytes += tx_bytes;
@@ -1059,7 +934,7 @@ static const struct net_device_ops qeth_l2_netdev_ops = {
        .ndo_start_xmit         = qeth_l2_hard_start_xmit,
        .ndo_validate_addr      = eth_validate_addr,
        .ndo_set_rx_mode        = qeth_l2_set_rx_mode,
-       .ndo_do_ioctl           = qeth_l2_do_ioctl,
+       .ndo_do_ioctl           = qeth_do_ioctl,
        .ndo_set_mac_address    = qeth_l2_set_mac_address,
        .ndo_change_mtu         = qeth_change_mtu,
        .ndo_vlan_rx_add_vid    = qeth_l2_vlan_rx_add_vid,
@@ -1116,7 +991,7 @@ static int qeth_l2_setup_netdev(struct qeth_card *card)
        card->dev->gso_max_size = (QETH_MAX_BUFFER_ELEMENTS(card) - 1) *
                                  PAGE_SIZE;
        SET_NETDEV_DEV(card->dev, &card->gdev->dev);
-       netif_napi_add(card->dev, &card->napi, qeth_l2_poll, QETH_NAPI_WEIGHT);
+       netif_napi_add(card->dev, &card->napi, qeth_poll, QETH_NAPI_WEIGHT);
        netif_carrier_off(card->dev);
        return register_netdev(card->dev);
 }
@@ -1326,17 +1201,6 @@ static void __exit qeth_l2_exit(void)
        pr_info("unregister layer 2 discipline\n");
 }
 
-static void qeth_l2_shutdown(struct ccwgroup_device *gdev)
-{
-       struct qeth_card *card = dev_get_drvdata(&gdev->dev);
-       qeth_set_allowed_threads(card, 0, 1);
-       if ((gdev->state == CCWGROUP_ONLINE) && card->info.hwtrap)
-               qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM);
-       qeth_qdio_clear_card(card, 0);
-       qeth_clear_qdio_buffers(card);
-       qdio_free(CARD_DDEV(card));
-}
-
 static int qeth_l2_pm_suspend(struct ccwgroup_device *gdev)
 {
        struct qeth_card *card = dev_get_drvdata(&gdev->dev);
@@ -1408,15 +1272,16 @@ struct qeth_discipline qeth_l2_discipline = {
        .start_poll = qeth_qdio_start_poll,
        .input_handler = (qdio_handler_t *) qeth_qdio_input_handler,
        .output_handler = (qdio_handler_t *) qeth_qdio_output_handler,
+       .process_rx_buffer = qeth_l2_process_inbound_buffer,
        .recover = qeth_l2_recover,
        .setup = qeth_l2_probe_device,
        .remove = qeth_l2_remove_device,
        .set_online = qeth_l2_set_online,
        .set_offline = qeth_l2_set_offline,
-       .shutdown = qeth_l2_shutdown,
        .freeze = qeth_l2_pm_suspend,
        .thaw = qeth_l2_pm_resume,
        .restore = qeth_l2_pm_resume,
+       .do_ioctl = NULL,
        .control_event_handler = qeth_l2_control_event,
 };
 EXPORT_SYMBOL_GPL(qeth_l2_discipline);