Date: Fri, 22 May 1998 10:32:35 +0200 (MET DST)
From: Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
To: linux-m68k@lists.linux-m68k.org
Subject: L68K: BIONET-LAN-Adapter (fwd)
Sender: owner-linux-m68k@phil.uni-sb.de
Reply-To: Roman.Hodek@informatik.uni-erlangen.de


Here is a patch by Karl-Heinz_Lohner@a.maus.de to make the BioNet
Ethernet adapter work again. The patch is for 2.0.33pl1, but should
equally apply to 2.1.101. The driver hasn't changed for ages :-)

Roman

------------------------------------------------------------------------------
--- atari_bionet.c.orig Mon May 11 18:14:30 1998
+++ atari_bionet.c  Thu May 21 17:07:58 1998
@@ -463,6 +463,28 @@
            buf = (unsigned long)&((struct nic_pkt_s
*)phys_nic_packet)->buffer;
        }
 
+       if (bionet_debug >1) {
+           u_char *data = nic_packet->buffer, *p;
+           int i;
+           
+           printk( "%s: TX pkt type 0x%4x from ", dev->name,
+                 ((u_short *)data)[6]);
+
+           for( p = &data[6], i = 0; i < 6; i++ )
+               printk("%02x%s", *p++,i != 5 ? ":" : "" );
+           printk(" to ");
+
+           for( p = data, i = 0; i < 6; i++ )
+               printk("%02x%s", *p++,i != 5 ? ":" : "" "\n" );
+
+           printk( "%s: ", dev->name );
+           printk(" data %02x%02x %02x%02x%02x%02x %02x%02x%02x%02x
%02x%02x%02x%02x %02x%02x%02x%02x"
+                  " %02x%02x%02x%02x len %d\n",
+                 data[12], data[13], data[14], data[15], data[16], data[17],
data[18], data[19],
+                 data[20], data[21], data[22], data[23], data[24], data[25],
data[26], data[27],
+                 data[28], data[29], data[30], data[31], data[32], data[33],
+                 length );
+       }
        dma_cache_maintenance(buf, length, 1);
 
        stat = hardware_send_packet(buf, length);
@@ -472,6 +494,9 @@
        dev->trans_start = jiffies;
        dev->tbusy   = 0;
    }
+   /*
+    * printk(" bionet_send_packet:  dev_kfree_skb\n");
+    */
    dev_kfree_skb(skb, FREE_WRITE);
 
    /* You might need to clean up and record Tx statistics here.
@@ -513,38 +538,71 @@
 
        /* Good packet... */
 
+       /*
+        * printk(" Good packet received.\n");
+        */
+
        dma_cache_maintenance((unsigned long)phys_nic_packet, 1520, 0);
 
        pkt_len = (nic_packet->l_hi << 8) | nic_packet->l_lo;
 
        lp->poll_time = bionet_min_poll_time;    /* fast poll */
-       if( pkt_len >= 60 && pkt_len <= 1514 ) {
-
+       if( pkt_len >= 60 && pkt_len <= 1520 ) {
+                   /*  ^^^^- war 1514 */
            /* Malloc up new buffer.
             */
-           struct sk_buff *skb = alloc_skb(pkt_len, GFP_ATOMIC);
+           struct sk_buff *skb = dev_alloc_skb( pkt_len + 2 );
            if (skb == NULL) {
                printk("%s: Memory squeeze, dropping packet.\n",
                    dev->name);
                lp->stats.rx_dropped++;
                break;
            }
-           skb->len = pkt_len;
            skb->dev = dev;
+           skb_reserve( skb, 2 );     /* 16 Byte align */
+           skb_put( skb, pkt_len );       /* Make Room */
 
            /* 'skb->data' points to the start of sk_buff data area.
             */
            memcpy(skb->data, nic_packet->buffer, pkt_len);
+           skb->protocol = eth_type_trans( skb, dev );
            netif_rx(skb);
            lp->stats.rx_packets++;
-       }
-   }
+
 
    /* If any worth-while packets have been received, dev_rint()
       has done a mark_bh(INET_BH) for us and will work on them
       when we get to the bottom-half routine.
     */
 
+           if (bionet_debug >1) {
+               u_char *data = nic_packet->buffer, *p;
+               int i;
+               
+               printk( "%s: RX pkt type 0x%4x from ", dev->name,
+                     ((u_short *)data)[6]);
+                    
+               
+               for( p = &data[6], i = 0; i < 6; i++ )
+                   printk("%02x%s", *p++,i != 5 ? ":" : "" );
+               printk(" to ");
+               for( p = data, i = 0; i < 6; i++ )
+                   printk("%02x%s", *p++,i != 5 ? ":" : "" "\n" );
+
+               printk( "%s: ", dev->name );
+               printk(" data %02x%02x %02x%02x%02x%02x %02x%02x%02x%02x
%02x%02x%02x%02x %02x%02x%02x%02x"
+                      " %02x%02x%02x%02x len %d\n",
+                     data[12], data[13], data[14], data[15], data[16],
data[17], data[18], data[19],
+                     data[20], data[21], data[22], data[23], data[24],
data[25], data[26], data[27],
+                     data[28], data[29], data[30], data[31], data[32],
data[33],
+                         pkt_len );
+           }
+       }
+       else {
+           printk(" Packet has wrong length: %04d bytes\n", pkt_len);
+           lp->stats.rx_errors++;
+       }
+   }
    stdma_release();
    ENABLE_IRQ();
    return;
