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