lkml.org 
[lkml]   [2002]   [Nov]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH] More znet updates
    From
    Date
    Hi all,

    Here is the latest round of my "znet 2.5 revival sessions" :

    - Make sure transceiver is powered on after waking up from suspend.
    - Fixed min_fr_len bug that I introduced.
    - Fixed Don Becker contacts.
    - Now survives unplugging/replugging cable.

    Patch is against 2.5.45.

    Linus, please apply.

    Thanks,

    M.

    ===== drivers/net/znet.c 1.6 vs 1.10 =====
    --- 1.6/drivers/net/znet.c Fri Oct 25 12:28:39 2002
    +++ 1.10/drivers/net/znet.c Fri Nov 1 12:19:48 2002
    @@ -72,7 +72,10 @@
    - Use proper resources management.
    - Use wireless/i82593.h as much as possible (structure, constants)
    - Compiles as module or build-in.
    + - Now survives unplugging/replugging cable.

    + Some code was taken from wavelan_cs.
    +
    Tested on a vintage Zenith Z-Note 433Lnp+. Probably broken on
    anything else. Testers (and detailed bug reports) are welcome :-).

    @@ -105,7 +108,7 @@
    /* This include could be elsewhere, since it is not wireless specific */
    #include "wireless/i82593.h"

    -static const char version[] __initdata = "znet.c:v1.02 9/23/94 becker@cesdis.gsfc.nasa.gov\n";
    +static const char version[] __initdata = "znet.c:v1.02 9/23/94 becker@scyld.com\n";

    #ifndef ZNET_DEBUG
    #define ZNET_DEBUG 1
    @@ -299,7 +302,7 @@
    cfblk->cd_filter = 0; /* CD is recognized immediately */

    /* Byte 9 */
    - cfblk->min_fr_len = 64 >> 2; /* Minimum frame length 64 bytes */
    + cfblk->min_fr_len = ETH_ZLEN >> 2; /* Minimum frame length */

    /* Byte A */
    cfblk->lng_typ = 1; /* Type/length checks OFF */
    @@ -544,10 +547,14 @@

    /* Check that the part hasn't reset itself, probably from suspend. */
    outb(CR0_STATUS_0, ioaddr);
    - if (inw(ioaddr) == 0x0010
    - && inw(ioaddr) == 0x0000
    - && inw(ioaddr) == 0x0010)
    - hardware_init(dev);
    + if (inw(ioaddr) == 0x0010 &&
    + inw(ioaddr) == 0x0000 &&
    + inw(ioaddr) == 0x0010) {
    + if (znet_debug > 1)
    + printk (KERN_WARNING "%s : waking up\n", dev->name);
    + hardware_init(dev);
    + znet_transceiver_power (dev, 1);
    + }

    if (1) {
    short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
    @@ -624,7 +631,9 @@
    if ((status & SR0_INTERRUPT) == 0)
    break;

    - if ((status & 0x0F) == SR0_TRANSMIT_DONE) {
    + if ((status & SR0_EVENT_MASK) == SR0_TRANSMIT_DONE ||
    + (status & SR0_EVENT_MASK) == SR0_RETRANSMIT_DONE ||
    + (status & SR0_EVENT_MASK) == SR0_TRANSMIT_NO_CRC_DONE) {
    int tx_status;
    outb(CR0_STATUS_1, ioaddr);
    tx_status = inw(ioaddr);
    @@ -644,6 +653,15 @@
    /* ...and the catch-all. */
    if ((tx_status | (TX_LOST_CRS | TX_LOST_CTS | TX_UND_RUN | TX_HRT_BEAT | TX_MAX_COL)) != (TX_LOST_CRS | TX_LOST_CTS | TX_UND_RUN | TX_HRT_BEAT | TX_MAX_COL))
    znet->stats.tx_errors++;
    +
    + /* Transceiver may be stuck if cable
    + * was removed while emiting a
    + * packet. Flip it off, then on to
    + * reset it. This is very empirical,
    + * but it seems to work. */
    +
    + znet_transceiver_power (dev, 0);
    + znet_transceiver_power (dev, 1);
    }
    netif_wake_queue (dev);
    }
    --
    Places change, faces change. Life is so very strange.
    \
     
     \ /
      Last update: 2005-03-22 13:30    [W:0.033 / U:30.216 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site