[eepro100] Transmitter Timeout -- addednum

chris chris@soma.978.org
Mon, 31 Jul 2000 02:30:13 -0700

Thank you very much, Kallol, I appreciate it!

It seems that in the v1.09 driver that the regular->multicast transmit
command issue was resolved:

In set_rx_mode():

		/* Change the command to a NoOp, pointing to the CmdMulti command. */
		sp->tx_skbuff[entry] = 0;
		sp->tx_ring[entry].status = cpu_to_le32(CmdNOp);
		sp->tx_ring[entry].link = virt_to_le32desc(mc_setup_frm);

I could not see the driver accounting for any other cases . . . would
you be so kind as to send me a copy of your "modified" driver so that I
may see what you did?

The code for the eepro100 driver is confusing me a bit. . . the rx ring
seems pretty clear and concise:

	* ethx is discovered and pci_dev is set up
	* pci_dev functions point to speedo functions, and a pointer is made to
struct speedo_private
	* a ring of RX_RING_SIZE sk_buffs is set up, and for each sk_buff a
RxFD->rx_buf_addr is pointed to sk_buff->tail
	* in speedo_private an array of rx_skbuf[] is set up pointing to the
	* in speedo_private an array rx_ringp[] is set up pointing to the RxFs
	* the eepro100 card DMAs the incoming data into the sk_buff->tail
pointed to by the RxF
	* the kernel knows how to deal with the sk_buff and takes the data.
	* not too shure on how the RxF are marked dirty and dealt with, but
that is not the issue.

As I had said, stright out of the text-book DMA-oriented driver. . . but
I can't figure out for the life of me how the tx ring is dealt with. . .
I'm assuming that the data to be sent is held in the same sk_buff
structure ring as the recieved data, but I can't even find where the
tx_ring[] is set up, nor can I grep out the structure definition for
sk_buff. . . .

In fact the only functions that I could find that are tx-oriented are
speedo_tx_timeout() which only seems to be dealt with how to reset the
card on a timeout and is only called by the kernel through the
pci_dev->tx_timeout() pointer, speedo_start_xmit() which seems to be
only called after the card changes transmit modes, and
speedo_tx_buffer_gc() which seems to free dirty tx sk_buffs and
increment the packet counter. . .why the driver frees sk_buffs, I also
don't understand, because as I see it the ring of sk_buffs are allocated
at init time and are marked as "dirty" so that new data is allowed to be
put in it. . . . .

I appreciate your patience and help in this matter.  I am fresh out of
college and have never witten a driver for linux before so thus it is a
little tricky for me to understand some of the very OS-orinted routines.
. . I did write a USB driver for a pure-hardware setup on an Ascend 550
series ATM switch in an internship, but that was very easy seeing that I
did not have to deal with an OS. . . .

I think after I figure this all out I'm going to go out an find an
obscure network card that a linux driver has not been written for and
give it a shot from scratch :). . . .recommend any good books?