if_ep.c (55833) | if_ep.c (55834) |
---|---|
1/* 2 * Copyright (c) 1994 Herb Peyerl <hpeyerl@novatel.ca> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 24 unchanged lines hidden (view full) --- 33/* 34 * Modified from the FreeBSD 1.1.5.1 version by: 35 * Andres Vega Garcia 36 * INRIA - Sophia Antipolis, France 37 * avega@sophia.inria.fr 38 */ 39 40/* | 1/* 2 * Copyright (c) 1994 Herb Peyerl <hpeyerl@novatel.ca> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 24 unchanged lines hidden (view full) --- 33/* 34 * Modified from the FreeBSD 1.1.5.1 version by: 35 * Andres Vega Garcia 36 * INRIA - Sophia Antipolis, France 37 * avega@sophia.inria.fr 38 */ 39 40/* |
41 * $FreeBSD: head/sys/dev/ep/if_ep.c 55833 2000-01-12 05:27:08Z mdodd $ | 41 * $FreeBSD: head/sys/dev/ep/if_ep.c 55834 2000-01-12 06:42:49Z mdodd $ |
42 * 43 * Promiscuous mode added and interrupt logic slightly changed 44 * to reduce the number of adapter failures. Transceiver select 45 * logic changed to use value from EEPROM. Autoconfiguration 46 * features added. 47 * Done by: 48 * Serge Babkin 49 * Chelindbank (Chelyabinsk, Russia) --- 381 unchanged lines hidden (view full) --- 431} 432 433static const char padmap[] = {0, 3, 2, 1}; 434 435static void 436ep_if_start(ifp) 437 struct ifnet *ifp; 438{ | 42 * 43 * Promiscuous mode added and interrupt logic slightly changed 44 * to reduce the number of adapter failures. Transceiver select 45 * logic changed to use value from EEPROM. Autoconfiguration 46 * features added. 47 * Done by: 48 * Serge Babkin 49 * Chelindbank (Chelyabinsk, Russia) --- 381 unchanged lines hidden (view full) --- 431} 432 433static const char padmap[] = {0, 3, 2, 1}; 434 435static void 436ep_if_start(ifp) 437 struct ifnet *ifp; 438{ |
439 register struct ep_softc *sc = ifp->if_softc; 440 register u_int len; 441 register struct mbuf *m; | 439 struct ep_softc *sc = ifp->if_softc; 440 u_int len; 441 struct mbuf *m; |
442 struct mbuf *top; 443 int s, pad; 444 445 if (sc->gone) { 446 return; 447 } 448 | 442 struct mbuf *top; 443 int s, pad; 444 445 if (sc->gone) { 446 return; 447 } 448 |
449 s = splimp(); | |
450 while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS); 451 if (ifp->if_flags & IFF_OACTIVE) { | 449 while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS); 450 if (ifp->if_flags & IFF_OACTIVE) { |
452 splx(s); | |
453 return; 454 } | 451 return; 452 } |
453 |
|
455startagain: 456 /* Sneak a peek at the next packet */ 457 m = ifp->if_snd.ifq_head; 458 if (m == 0) { | 454startagain: 455 /* Sneak a peek at the next packet */ 456 m = ifp->if_snd.ifq_head; 457 if (m == 0) { |
459 splx(s); | |
460 return; 461 } 462 for (len = 0, top = m; m; m = m->m_next) 463 len += m->m_len; 464 465 pad = padmap[len & 3]; 466 467 /* --- 12 unchanged lines hidden (view full) --- 480 /* no room in FIFO */ 481 outw(BASE + EP_COMMAND, SET_TX_AVAIL_THRESH | (len + pad + 4)); 482 /* make sure */ 483 if (inw(BASE + EP_W1_FREE_TX) < len + pad + 4) { 484 ifp->if_flags |= IFF_OACTIVE; 485 splx(s); 486 return; 487 } | 458 return; 459 } 460 for (len = 0, top = m; m; m = m->m_next) 461 len += m->m_len; 462 463 pad = padmap[len & 3]; 464 465 /* --- 12 unchanged lines hidden (view full) --- 478 /* no room in FIFO */ 479 outw(BASE + EP_COMMAND, SET_TX_AVAIL_THRESH | (len + pad + 4)); 480 /* make sure */ 481 if (inw(BASE + EP_W1_FREE_TX) < len + pad + 4) { 482 ifp->if_flags |= IFF_OACTIVE; 483 splx(s); 484 return; 485 } |
486 } else { 487 outw(BASE + EP_COMMAND, SET_TX_AVAIL_THRESH | EP_THRESH_DISABLE); |
|
488 } | 488 } |
489 |
|
489 IF_DEQUEUE(&ifp->if_snd, m); 490 | 490 IF_DEQUEUE(&ifp->if_snd, m); 491 |
492 s = splhigh(); 493 |
|
491 outw(BASE + EP_W1_TX_PIO_WR_1, len); 492 outw(BASE + EP_W1_TX_PIO_WR_1, 0x0); /* Second dword meaningless */ 493 | 494 outw(BASE + EP_W1_TX_PIO_WR_1, len); 495 outw(BASE + EP_W1_TX_PIO_WR_1, 0x0); /* Second dword meaningless */ 496 |
494 for (top = m; m != 0; m = m->m_next) 495 if (EP_FTST(sc, F_ACCESS_32_BITS)) { | 497 if (EP_FTST(sc, F_ACCESS_32_BITS)) { 498 for (top = m; m != 0; m = m->m_next) { |
496 outsl(BASE + EP_W1_TX_PIO_WR_1, mtod(m, caddr_t), 497 m->m_len / 4); 498 if (m->m_len & 3) 499 outsb(BASE + EP_W1_TX_PIO_WR_1, 500 mtod(m, caddr_t) + (m->m_len & (~3)), 501 m->m_len & 3); | 499 outsl(BASE + EP_W1_TX_PIO_WR_1, mtod(m, caddr_t), 500 m->m_len / 4); 501 if (m->m_len & 3) 502 outsb(BASE + EP_W1_TX_PIO_WR_1, 503 mtod(m, caddr_t) + (m->m_len & (~3)), 504 m->m_len & 3); |
502 } else { | 505 } 506 } else { 507 for (top = m; m != 0; m = m->m_next) { |
503 outsw(BASE + EP_W1_TX_PIO_WR_1, mtod(m, caddr_t), m->m_len / 2); 504 if (m->m_len & 1) 505 outb(BASE + EP_W1_TX_PIO_WR_1, 506 *(mtod(m, caddr_t) + m->m_len - 1)); 507 } | 508 outsw(BASE + EP_W1_TX_PIO_WR_1, mtod(m, caddr_t), m->m_len / 2); 509 if (m->m_len & 1) 510 outb(BASE + EP_W1_TX_PIO_WR_1, 511 *(mtod(m, caddr_t) + m->m_len - 1)); 512 } |
513 } |
|
508 509 while (pad--) 510 outb(BASE + EP_W1_TX_PIO_WR_1, 0); /* Padding */ 511 | 514 515 while (pad--) 516 outb(BASE + EP_W1_TX_PIO_WR_1, 0); /* Padding */ 517 |
518 splx(s); 519 |
|
512 if (ifp->if_bpf) { 513 bpf_mtap(ifp, top); 514 } 515 516 ifp->if_timer = 2; 517 ifp->if_opackets++; 518 m_freem(top); 519 --- 5 unchanged lines hidden (view full) --- 525 if (inw(BASE + EP_W1_RX_STATUS) & RX_BYTES_MASK) { 526 /* 527 * we check if we have packets left, in that case we prepare to come 528 * back later 529 */ 530 if (ifp->if_snd.ifq_head) { 531 outw(BASE + EP_COMMAND, SET_TX_AVAIL_THRESH | 8); 532 } | 520 if (ifp->if_bpf) { 521 bpf_mtap(ifp, top); 522 } 523 524 ifp->if_timer = 2; 525 ifp->if_opackets++; 526 m_freem(top); 527 --- 5 unchanged lines hidden (view full) --- 533 if (inw(BASE + EP_W1_RX_STATUS) & RX_BYTES_MASK) { 534 /* 535 * we check if we have packets left, in that case we prepare to come 536 * back later 537 */ 538 if (ifp->if_snd.ifq_head) { 539 outw(BASE + EP_COMMAND, SET_TX_AVAIL_THRESH | 8); 540 } |
533 splx(s); | |
534 return; 535 } 536 goto startagain; 537} 538 539void 540ep_intr(arg) 541 void *arg; --- 435 unchanged lines hidden --- | 541 return; 542 } 543 goto startagain; 544} 545 546void 547ep_intr(arg) 548 void *arg; --- 435 unchanged lines hidden --- |