Lines Matching +full:packet +full:- +full:oriented

2 Ported to U-Boot by Christian Pellegrin <chri@ascensit.com>
16 -------------------------------------------
31 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
44 at http://sources.redhat.com/ecos/ecos-license/
45 -------------------------------------------
49 -------------------------------------------
54 -------------------------------------------
62 Date: 2001-06-13
113 base = dp->base; in dp83902a_init()
125 DP_IN(base, DP_P1_PAR0+i, dp->esa[i]); in dp83902a_init()
128 printf("NE2000 - %s ESA: %02x:%02x:%02x:%02x:%02x:%02x\n", in dp83902a_init()
130 dp->esa[0], in dp83902a_init()
131 dp->esa[1], in dp83902a_init()
132 dp->esa[2], in dp83902a_init()
133 dp->esa[3], in dp83902a_init()
134 dp->esa[4], in dp83902a_init()
135 dp->esa[5] ); in dp83902a_init()
137 memcpy(enetaddr, dp->esa, 6); /* Use MAC from serial EEPROM */ in dp83902a_init()
146 u8 *base = dp->base; in dp83902a_stop()
154 dp->running = false; in dp83902a_stop()
160 * called whenever something "hardware oriented" changes and should leave
167 u8 *base = dp->base; in dp83902a_start()
180 DP_OUT(base, DP_TPSR, dp->tx_buf1); /* Transmitter start page */ in dp83902a_start()
181 dp->tx1 = dp->tx2 = 0; in dp83902a_start()
182 dp->tx_next = dp->tx_buf1; in dp83902a_start()
183 dp->tx_started = false; in dp83902a_start()
184 dp->running = true; in dp83902a_start()
185 DP_OUT(base, DP_PSTART, dp->rx_buf_start); /* Receive ring start page */ in dp83902a_start()
186 DP_OUT(base, DP_BNDRY, dp->rx_buf_end - 1); /* Receive ring boundary */ in dp83902a_start()
187 DP_OUT(base, DP_PSTOP, dp->rx_buf_end); /* Receive ring end page */ in dp83902a_start()
188 dp->rx_next = dp->rx_buf_start - 1; in dp83902a_start()
189 dp->running = true; in dp83902a_start()
193 DP_OUT(base, DP_P1_CURP, dp->rx_buf_start); /* Current page - next free page for Rx */ in dp83902a_start()
194 dp->running = true; in dp83902a_start()
205 dp->running = true; in dp83902a_start()
218 u8 *base = dp->base; in dp83902a_start_xmit()
224 if (dp->tx_started) in dp83902a_start_xmit()
235 dp->tx_started = true; in dp83902a_start_xmit()
239 * This routine is called to send data to the hardware. It is known a-priori
240 * that there is free buffer space (dp->tx_next).
246 u8 *base = dp->base; in dp83902a_send()
258 start_page = dp->tx_next; in dp83902a_send()
259 if (dp->tx_next == dp->tx_buf1) { in dp83902a_send()
260 dp->tx1 = start_page; in dp83902a_send()
261 dp->tx1_len = pkt_len; in dp83902a_send()
262 dp->tx1_key = key; in dp83902a_send()
263 dp->tx_next = dp->tx_buf2; in dp83902a_send()
265 dp->tx2 = start_page; in dp83902a_send()
266 dp->tx2_len = pkt_len; in dp83902a_send()
267 dp->tx2_key = key; in dp83902a_send()
268 dp->tx_next = dp->tx_buf1; in dp83902a_send()
286 DP_OUT(base, DP_RSAL, 0x100 - len); in dp83902a_send()
287 DP_OUT(base, DP_RSAH, (start_page - 1) & 0xff); in dp83902a_send()
291 DP_IN_DATA(dp->data, tmp); in dp83902a_send()
320 DP_OUT_DATA(dp->data, *data++); in dp83902a_send()
321 len--; in dp83902a_send()
328 printf(" + %d bytes of padding\n", pkt_len - total_len); in dp83902a_send()
333 DP_OUT_DATA(dp->data, 0); in dp83902a_send()
355 if (!dp->tx_started) { in dp83902a_send()
356 if (start_page == dp->tx1) { in dp83902a_send()
357 dp->tx_int = 1; /* Expecting interrupt from BUF1 */ in dp83902a_send()
359 dp->tx_int = 2; /* Expecting interrupt from BUF2 */ in dp83902a_send()
366 * This function is called when a packet has been received. It's job is
367 * to prepare to unload the packet from the hardware. Once the length of
368 * the packet is known, the upper layer of the driver can be told. When
369 * the upper layer is ready to unload the packet, the internal function
376 u8 *base = dp->base; in dp83902a_RxEvent()
385 /* Read incoming packet header */ in dp83902a_RxEvent()
392 if (pkt == dp->rx_buf_end) in dp83902a_RxEvent()
393 pkt = dp->rx_buf_start; in dp83902a_RxEvent()
402 if (dp->rx_next == pkt) { in dp83902a_RxEvent()
403 if (cur == dp->rx_buf_start) in dp83902a_RxEvent()
404 DP_OUT(base, DP_BNDRY, dp->rx_buf_end - 1); in dp83902a_RxEvent()
406 DP_OUT(base, DP_BNDRY, cur - 1); /* Update pointer */ in dp83902a_RxEvent()
409 dp->rx_next = pkt; in dp83902a_RxEvent()
418 DP_IN_DATA(dp->data, rcv_hdr[i++]); in dp83902a_RxEvent()
425 len = ((rcv_hdr[3] << 8) | rcv_hdr[2]) - sizeof(rcv_hdr); in dp83902a_RxEvent()
430 if (rcv_hdr[1] == dp->rx_buf_start) in dp83902a_RxEvent()
431 DP_OUT(base, DP_BNDRY, dp->rx_buf_end - 1); in dp83902a_RxEvent()
433 DP_OUT(base, DP_BNDRY, rcv_hdr[1] - 1); /* Update pointer */ in dp83902a_RxEvent()
439 * It's job is to actually fetch data for a packet from the hardware once
440 * memory buffers have been allocated for the packet. Note that the buffers
441 * may come in pieces, using a scatter-gather list. This allows for more
448 u8 *base = dp->base; in dp83902a_recv()
459 printf("Rx packet %d length %d\n", dp->rx_next, len); in dp83902a_recv()
462 /* Read incoming packet data */ in dp83902a_recv()
467 DP_OUT(base, DP_RSAH, dp->rx_next); in dp83902a_recv()
486 mlen--; in dp83902a_recv()
493 DP_IN_DATA(dp->data, tmp); in dp83902a_recv()
499 mlen--; in dp83902a_recv()
513 u8 *base = dp->base; in dp83902a_TxEvent()
520 if (dp->tx_int == 1) { in dp83902a_TxEvent()
521 key = dp->tx1_key; in dp83902a_TxEvent()
522 dp->tx1 = 0; in dp83902a_TxEvent()
524 key = dp->tx2_key; in dp83902a_TxEvent()
525 dp->tx2 = 0; in dp83902a_TxEvent()
527 /* Start next packet if one is ready */ in dp83902a_TxEvent()
528 dp->tx_started = false; in dp83902a_TxEvent()
529 if (dp->tx1) { in dp83902a_TxEvent()
530 dp83902a_start_xmit(dp->tx1, dp->tx1_len); in dp83902a_TxEvent()
531 dp->tx_int = 1; in dp83902a_TxEvent()
532 } else if (dp->tx2) { in dp83902a_TxEvent()
533 dp83902a_start_xmit(dp->tx2, dp->tx2_len); in dp83902a_TxEvent()
534 dp->tx_int = 2; in dp83902a_TxEvent()
536 dp->tx_int = 0; in dp83902a_TxEvent()
538 /* Tell higher level we sent this packet */ in dp83902a_TxEvent()
550 u8 *base = dp->base; in dp83902a_ClearCounters()
567 u8 *base = dp->base; in dp83902a_Overflow()
599 if (dp->tx_started && !(isr & (DP_ISR_TxP|DP_ISR_TxE))) { in dp83902a_Overflow()
608 u8 *base = dp->base; in dp83902a_poll()
636 if (!dp->running) break; /* Is this necessary? */ in dp83902a_poll()
641 if (isr & (DP_ISR_TxP|DP_ISR_TxE) && dp->tx_started) { in dp83902a_poll()
653 /* U-Boot specific routines */
656 static int pkey = -1;
662 printf("NE2000: packet too big\n"); in uboot_push_packet_len()
680 * @param struct ethdevice of this instance of the driver for dev->enetaddr
681 * @return 0 on success, -1 on error (causing caller to print error msg)
691 return -1; in ne2k_setup_driver()
718 if (!eth_env_get_enetaddr("ethaddr", dev->enetaddr)) { in ne2k_setup_driver()
720 if (!get_prom(dev->enetaddr, nic.base)) /* get MAC from prom */ in ne2k_setup_driver()
721 dp83902a_init(dev->enetaddr); /* fallback: seeprom */ in ne2k_setup_driver()
723 * returns -1 due to eth_env_get_enetaddr_by_index() failing, in ne2k_setup_driver()
726 eth_env_set_enetaddr("ethaddr", dev->enetaddr); in ne2k_setup_driver()
733 dp83902a_start(dev->enetaddr); in ne2k_init()
752 static int ne2k_send(struct eth_device *dev, void *packet, int length) in ne2k_send() argument
758 pkey = -1; in ne2k_send()
760 dp83902a_send((u8 *) packet, length, 666); in ne2k_send()
764 if (pkey != -1) { in ne2k_send()
765 PRINTK("Packet sucesfully sent\n"); in ne2k_send()
779 * @return 0 on success, -1 on error (causing caller to print error msg)
787 return -1; in ne2k_register()
790 return -1; in ne2k_register()
792 dev->init = ne2k_init; in ne2k_register()
793 dev->halt = ne2k_halt; in ne2k_register()
794 dev->send = ne2k_send; in ne2k_register()
795 dev->recv = ne2k_recv; in ne2k_register()
797 strcpy(dev->name, "NE2000"); in ne2k_register()