{
unsigned int DnNextPtr;
unsigned int FrameStartHeader;
- unsigned int DataAddr;
- unsigned int DataLength;
+ struct {
+ unsigned int addr;
+ unsigned int len;
+ } __attribute ((aligned(8))) segments[64];
}
TXD __attribute__ ((aligned(8))); /* 64-bit aligned for bus mastering */
*** pkt - the pointer to the packet data itself.
***/
static void
-a3c90x_transmit(unsigned int size, const char *pkt)
+a3c90x_transmit(struct pbuf *p)
{
unsigned char status;
static unsigned int stillwaiting = 0;
+ unsigned int n, len;
if (stillwaiting)
{
- outputf("Waiting for network completion...");
while (!(inw(INF_3C90X.IOAddr + regCommandIntStatus_w) & INT_TXCOMPLETE) && oneshot_running())
;
- outputf("Done");
if (!(inw(INF_3C90X.IOAddr + regCommandIntStatus_w) & INT_TXCOMPLETE))
{
outputf("3c90x: tx timeout? txstat %02x", inb(INF_3C90X.IOAddr + regTxStatus_b));
/** Setup the DPD (download descriptor) **/
INF_3C90X.TransmitDPD.DnNextPtr = 0;
+ len = 0;
+ n = 0;
+ for (; p; p = p->next)
+ {
+ INF_3C90X.TransmitDPD.segments[n].addr = (unsigned int)p->payload;
+ INF_3C90X.TransmitDPD.segments[n].len = p->len | (p->next ? 0 : (1 << 31));
+ len += p->len;
+ n++;
+ }
/** set notification for transmission completion (bit 15) **/
- INF_3C90X.TransmitDPD.FrameStartHeader = (size) | 0x8000;
- INF_3C90X.TransmitDPD.DataAddr = v2p((void*)pkt);
- INF_3C90X.TransmitDPD.DataLength = size + (1<<31);
+ INF_3C90X.TransmitDPD.FrameStartHeader = (len) | 0x8000;
+ outputf("3c90x: Sending %d byte %d seg packet", len, n);
+
/** Send the packet **/
outl(INF_3C90X.IOAddr + regDnListPtr_l, v2p(&(INF_3C90X.TransmitDPD)));
_issue_command(INF_3C90X.IOAddr, cmdStallCtl, 3 /* Unstall download */);
#define _ETHERBOOT_COMPAT_H
#include <paging.h>
+#include "lwip/pbuf.h"
#define ETH_ALEN 6
unsigned char hwaddr[6];
int (*poll) (struct nic *nic, int retrieve);
- void (*transmit) (unsigned int size, const char *pkt);
+ void (*transmit) (struct pbuf *p);
};
#define virt_to_bus(x) memory_v2p((void *)(x))
static err_t _transmit(struct netif *netif, struct pbuf *p)
{
struct nic *nic = netif->state;
- struct pbuf *q;
- unsigned char pkt[1600];
- unsigned int len = 0;
- for(q = p; q != NULL; q = q->next)
+/* for(q = p; q != NULL; q = q->next)
{
memcpy(pkt + len, q->payload, q->len);
len += q->len;
- }
+ }*/
- outputf("NIC: Transmit packet: %d bytes", len);
+ outputf("NIC: Transmit packet");
- nic->transmit(len, pkt);
+ nic->transmit(p);
LINK_STATS_INC(link.xmit);