···1/* orinoco_nortel.c2 * 3 * Driver for Prism II devices which would usually be driven by orinoco_cs,004 * but are connected to the PCI bus by a Nortel PCI-PCMCIA-Adapter. 5 *6 * Copyright (C) 2002 Tobias Hoffmann···167 goto fail_resources;168 }169170- iomem = pci_iomap(pdev, 3, 0);171 if (!iomem) {172 err = -ENOMEM;173 goto fail_map_io;···267static struct pci_device_id nortel_pci_id_table[] = {268 /* Nortel emobility PCI */269 {0x126c, 0x8030, PCI_ANY_ID, PCI_ANY_ID,},00270 {0,},271};272
···1/* orinoco_nortel.c2 * 3 * Driver for Prism II devices which would usually be driven by orinoco_cs,4+ * but are connected to the PCI bus by a PCI-to-PCMCIA adapter used in5+ * Nortel emobility, Symbol LA-4113 and Symbol LA-4123.6 * but are connected to the PCI bus by a Nortel PCI-PCMCIA-Adapter. 7 *8 * Copyright (C) 2002 Tobias Hoffmann···165 goto fail_resources;166 }167168+ iomem = pci_iomap(pdev, 2, 0);169 if (!iomem) {170 err = -ENOMEM;171 goto fail_map_io;···265static struct pci_device_id nortel_pci_id_table[] = {266 /* Nortel emobility PCI */267 {0x126c, 0x8030, PCI_ANY_ID, PCI_ANY_ID,},268+ /* Symbol LA-4123 PCI */269+ {0x1562, 0x0001, PCI_ANY_ID, PCI_ANY_ID,},270 {0,},271};272
+2-1
drivers/s390/net/qeth_eddp.c
···62 for (i = 0; i < ctx->num_pages; ++i)63 free_page((unsigned long)ctx->pages[i]);64 kfree(ctx->pages);65- kfree(ctx->elements);066 kfree(ctx);67}68
···62 for (i = 0; i < ctx->num_pages; ++i)63 free_page((unsigned long)ctx->pages[i]);64 kfree(ctx->pages);65+ if (ctx->elements != NULL)66+ kfree(ctx->elements);67 kfree(ctx);68}69
+29-32
drivers/s390/net/qeth_main.c
···1/*2 *3- * linux/drivers/s390/net/qeth_main.c ($Revision: 1.242 $)4 *5 * Linux on zSeries OSA Express and HiperSockets support6 *···12 * Frank Pavlic (fpavlic@de.ibm.com) and13 * Thomas Spatzier <tspat@de.ibm.com>14 *15- * $Revision: 1.242 $ $Date: 2005/05/04 20:19:18 $16 *17 * This program is free software; you can redistribute it and/or modify18 * it under the terms of the GNU General Public License as published by···72#include "qeth_eddp.h"73#include "qeth_tso.h"7475-#define VERSION_QETH_C "$Revision: 1.242 $"76static const char *version = "qeth S/390 OSA-Express driver";7778/**···518519 QETH_DBF_TEXT(setup, 3, "setoffl");520 QETH_DBF_HEX(setup, 3, &card, sizeof(void *));521-0522 recover_flag = card->state;523 if (qeth_stop_card(card, recovery_mode) == -ERESTARTSYS){524 PRINT_WARN("Stopping card %s interrupted by user!\n",···1021qeth_schedule_recovery(struct qeth_card *card)1022{1023 QETH_DBF_TEXT(trace,2,"startrec");1024-1025 if (qeth_set_thread_start_bit(card, QETH_RECOVER_THREAD) == 0)1026 schedule_work(&card->kernel_thread_starter);1027}···1710 "IP address reset.\n",1711 QETH_CARD_IFNAME(card),1712 card->info.chpid);1713- netif_carrier_on(card->dev);1714 qeth_schedule_recovery(card);1715 return NULL;1716 case IPA_CMD_MODCCID:···1958{1959 u16 s1, s2;19601961-QETH_DBF_TEXT(trace,4,"osndipa");19621963 qeth_prepare_ipa_cmd(card, iob, QETH_PROT_OSN2);1964 s1 = (u16)(IPA_PDU_HEADER_SIZE + data_len);···2202}22032204static inline int2205-qeth_check_for_inbound_error(struct qeth_qdio_buffer *buf,2206- unsigned int qdio_error,2207- unsigned int siga_error)2208{2209- int rc = 0;2210-2211 if (qdio_error || siga_error) {2212- QETH_DBF_TEXT(trace, 2, "qdinerr");2213- QETH_DBF_TEXT(qerr, 2, "qdinerr");2214 QETH_DBF_TEXT_(qerr, 2, " F15=%02X",2215- buf->buffer->element[15].flags & 0xff);2216 QETH_DBF_TEXT_(qerr, 2, " F14=%02X",2217- buf->buffer->element[14].flags & 0xff);2218 QETH_DBF_TEXT_(qerr, 2, " qerr=%X", qdio_error);2219 QETH_DBF_TEXT_(qerr, 2, " serr=%X", siga_error);2220- rc = 1;2221 }2222- return rc;2223}22242225static inline struct sk_buff *···2765 for (i = first_element; i < (first_element + count); ++i) {2766 index = i % QDIO_MAX_BUFFERS_PER_Q;2767 buffer = &card->qdio.in_q->bufs[index];2768- if (!((status == QDIO_STATUS_LOOK_FOR_ERROR) &&2769- qeth_check_for_inbound_error(buffer, qdio_err, siga_err)))02770 qeth_process_inbound_buffer(card, buffer, index);2771 /* clear buffer and give back to hardware */2772 qeth_put_buffer_pool_entry(card, buffer->pool_entry);···2782static inline int2783qeth_handle_send_error(struct qeth_card *card,2784 struct qeth_qdio_out_buffer *buffer,2785- int qdio_err, int siga_err)2786{2787 int sbalf15 = buffer->buffer->element[15].flags & 0xff;2788 int cc = siga_err & 3;27892790 QETH_DBF_TEXT(trace, 6, "hdsnderr");02791 switch (cc) {2792 case 0:2793 if (qdio_err){···3045 for(i = first_element; i < (first_element + count); ++i){3046 buffer = &queue->bufs[i % QDIO_MAX_BUFFERS_PER_Q];3047 /*we only handle the KICK_IT error by doing a recovery */3048- if (qeth_handle_send_error(card, buffer, qdio_error, siga_error)03049 == QETH_SEND_ERROR_KICK_IT){3050 netif_stop_queue(card->dev);3051 qeth_schedule_recovery(card);···3288 card->qdio.in_buf_pool.buf_count = card->qdio.init_pool.buf_count;3289 INIT_LIST_HEAD(&card->qdio.in_buf_pool.entry_list);3290 INIT_LIST_HEAD(&card->qdio.init_pool.entry_list);3291- /* outbound */3292}32933294static int···3729 break;3730 }3731 }0003732#endif3733 return rc;3734}···3808 card->data.state = CH_STATE_UP;3809 card->state = CARD_STATE_UP;38103811- if (!card->lan_online){3812- if (netif_carrier_ok(dev))3813- netif_carrier_off(dev);3814- }3815 return 0;3816}3817···5869 struct inet6_dev *in6_dev;58705871 QETH_DBF_TEXT(trace,4,"chkmcv6");5872- if ((card->options.layer2 == 0) &&5873- (!qeth_is_supported(card, IPA_IPV6)) )5874 return ;5875-5876 in6_dev = in6_dev_get(card->dev);5877 if (in6_dev == NULL)5878 return;···7933 QETH_DBF_TEXT_(setup, 2, "6err%d", rc);7934 goto out_remove;7935 }7936-/*maybe it was set offline without ifconfig down7937- * we can also use this state for recovery purposes*/7938 qeth_set_allowed_threads(card, 0xffffffff, 0);7939 if (recover_flag == CARD_STATE_RECOVER)7940 qeth_start_again(card, recovery_mode);
···1/*2 *3+ * linux/drivers/s390/net/qeth_main.c ($Revision: 1.251 $)4 *5 * Linux on zSeries OSA Express and HiperSockets support6 *···12 * Frank Pavlic (fpavlic@de.ibm.com) and13 * Thomas Spatzier <tspat@de.ibm.com>14 *15+ * $Revision: 1.251 $ $Date: 2005/05/04 20:19:18 $16 *17 * This program is free software; you can redistribute it and/or modify18 * it under the terms of the GNU General Public License as published by···72#include "qeth_eddp.h"73#include "qeth_tso.h"7475+#define VERSION_QETH_C "$Revision: 1.251 $"76static const char *version = "qeth S/390 OSA-Express driver";7778/**···518519 QETH_DBF_TEXT(setup, 3, "setoffl");520 QETH_DBF_HEX(setup, 3, &card, sizeof(void *));521+522+ netif_carrier_off(card->dev);523 recover_flag = card->state;524 if (qeth_stop_card(card, recovery_mode) == -ERESTARTSYS){525 PRINT_WARN("Stopping card %s interrupted by user!\n",···1020qeth_schedule_recovery(struct qeth_card *card)1021{1022 QETH_DBF_TEXT(trace,2,"startrec");01023 if (qeth_set_thread_start_bit(card, QETH_RECOVER_THREAD) == 0)1024 schedule_work(&card->kernel_thread_starter);1025}···1710 "IP address reset.\n",1711 QETH_CARD_IFNAME(card),1712 card->info.chpid);01713 qeth_schedule_recovery(card);1714 return NULL;1715 case IPA_CMD_MODCCID:···1959{1960 u16 s1, s2;19611962+ QETH_DBF_TEXT(trace,4,"osndipa");19631964 qeth_prepare_ipa_cmd(card, iob, QETH_PROT_OSN2);1965 s1 = (u16)(IPA_PDU_HEADER_SIZE + data_len);···2203}22042205static inline int2206+qeth_check_qdio_errors(struct qdio_buffer *buf, unsigned int qdio_error,2207+ unsigned int siga_error, const char *dbftext)02208{002209 if (qdio_error || siga_error) {2210+ QETH_DBF_TEXT(trace, 2, dbftext);2211+ QETH_DBF_TEXT(qerr, 2, dbftext);2212 QETH_DBF_TEXT_(qerr, 2, " F15=%02X",2213+ buf->element[15].flags & 0xff);2214 QETH_DBF_TEXT_(qerr, 2, " F14=%02X",2215+ buf->element[14].flags & 0xff);2216 QETH_DBF_TEXT_(qerr, 2, " qerr=%X", qdio_error);2217 QETH_DBF_TEXT_(qerr, 2, " serr=%X", siga_error);2218+ return 1;2219 }2220+ return 0;2221}22222223static inline struct sk_buff *···2769 for (i = first_element; i < (first_element + count); ++i) {2770 index = i % QDIO_MAX_BUFFERS_PER_Q;2771 buffer = &card->qdio.in_q->bufs[index];2772+ if (!((status & QDIO_STATUS_LOOK_FOR_ERROR) &&2773+ qeth_check_qdio_errors(buffer->buffer, 2774+ qdio_err, siga_err,"qinerr")))2775 qeth_process_inbound_buffer(card, buffer, index);2776 /* clear buffer and give back to hardware */2777 qeth_put_buffer_pool_entry(card, buffer->pool_entry);···2785static inline int2786qeth_handle_send_error(struct qeth_card *card,2787 struct qeth_qdio_out_buffer *buffer,2788+ unsigned int qdio_err, unsigned int siga_err)2789{2790 int sbalf15 = buffer->buffer->element[15].flags & 0xff;2791 int cc = siga_err & 3;27922793 QETH_DBF_TEXT(trace, 6, "hdsnderr");2794+ qeth_check_qdio_errors(buffer->buffer, qdio_err, siga_err, "qouterr");2795 switch (cc) {2796 case 0:2797 if (qdio_err){···3047 for(i = first_element; i < (first_element + count); ++i){3048 buffer = &queue->bufs[i % QDIO_MAX_BUFFERS_PER_Q];3049 /*we only handle the KICK_IT error by doing a recovery */3050+ if (qeth_handle_send_error(card, buffer,3051+ qdio_error, siga_error)3052 == QETH_SEND_ERROR_KICK_IT){3053 netif_stop_queue(card->dev);3054 qeth_schedule_recovery(card);···3289 card->qdio.in_buf_pool.buf_count = card->qdio.init_pool.buf_count;3290 INIT_LIST_HEAD(&card->qdio.in_buf_pool.entry_list);3291 INIT_LIST_HEAD(&card->qdio.init_pool.entry_list);03292}32933294static int···3731 break;3732 }3733 }3734+ if (rc && !(VLAN_DEV_INFO(dev)->real_dev->priv == (void *)card))3735+ return 0;3736+3737#endif3738 return rc;3739}···3807 card->data.state = CH_STATE_UP;3808 card->state = CARD_STATE_UP;38093810+ if (!card->lan_online && netif_carrier_ok(dev))3811+ netif_carrier_off(dev);003812 return 0;3813}3814···5870 struct inet6_dev *in6_dev;58715872 QETH_DBF_TEXT(trace,4,"chkmcv6");5873+ if (!qeth_is_supported(card, IPA_IPV6)) 05874 return ;05875 in6_dev = in6_dev_get(card->dev);5876 if (in6_dev == NULL)5877 return;···7936 QETH_DBF_TEXT_(setup, 2, "6err%d", rc);7937 goto out_remove;7938 }7939+ netif_carrier_on(card->dev);7940+7941 qeth_set_allowed_threads(card, 0xffffffff, 0);7942 if (recover_flag == CARD_STATE_RECOVER)7943 qeth_start_again(card, recovery_mode);