I got bored of manually running `ifconfig eth0 promisc` for my xircom card
so this night I gone into it ;).

Following the specification it's clear why it couldn't work without the
promiscuous bit set in cr6.

This is the fix against the latest pcmcia-cs.26-Apr-00.tar.gz but it
should apply correctly also to the latest stable pcmcia-cb releases. Works
fine for me now.

--- pcmcia-cs-3.1.15/clients/tulip_cb.c.~1~     Thu Apr 27 00:56:53 2000
+++ pcmcia-cs-3.1.15/clients/tulip_cb.c Sat Apr 29 04:53:34 2000
@@ -614,7 +614,7 @@
                restore_flags(flags);
                return;
     }
-    newcsr6 &= 0x726cfeca; /* mask out the reserved CSR6 bits that always */
+    newcsr6 &= 0x726cfecb; /* mask out the reserved CSR6 bits that always */
                           /* read 0 on the Xircom cards */
     newcsr6 |= 0x320c0000; /* or in the reserved bits that always read 1 */
     currcsr6 = inl(ioaddr + CSR6);
@@ -1634,7 +1634,7 @@
                tp->tx_ring[0].length = cpu_to_le32(0x08000000 | 192);
                /* Lie about the address of our setup frame to make the */
                /* chip happy */
-               tp->tx_ring[0].buffer1 = (virt_to_le32desc(tp->setup_frame) + 4);
+               tp->tx_ring[0].buffer1 = virt_to_le32desc(tp->setup_frame);
                tp->tx_ring[0].status = cpu_to_le32(DescOwned);
 
                tp->cur_tx++;
@@ -3427,10 +3427,7 @@
                        if (entry == TX_RING_SIZE-1)
                                tx_flags |= DESC_RING_WRAP;             /* Wrap ring. 
*/
                        tp->tx_ring[entry].length = cpu_to_le32(tx_flags);
-                       if(tp->chip_id == X3201_3)
-                               tp->tx_ring[entry].buffer1 = 
(virt_to_le32desc(tp->setup_frame) + 4);
-                       else
-                               tp->tx_ring[entry].buffer1 = 
virt_to_le32desc(tp->setup_frame);
+                       tp->tx_ring[entry].buffer1 = virt_to_le32desc(tp->setup_frame);
                        tp->tx_ring[entry].status = cpu_to_le32(DescOwned);
                        if (tp->cur_tx - tp->dirty_tx >= TX_RING_SIZE - 2) {
                                netif_stop_queue(dev);


Andrea

Reply via email to