1/* 2 * Copyright (c) 1995, David Greenman 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 9 * notice unmodified, this list of conditions, and the following 10 * disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 *
| 1/* 2 * Copyright (c) 1995, David Greenman 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 9 * notice unmodified, this list of conditions, and the following 10 * disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 *
|
27 * $FreeBSD: head/sys/dev/fxp/if_fxp.c 22253 1997-02-04 07:39:28Z dg $
| 27 * $FreeBSD: head/sys/dev/fxp/if_fxp.c 22255 1997-02-04 10:53:12Z dg $
|
28 */ 29 30/* 31 * Intel EtherExpress Pro/100B PCI Fast Ethernet driver 32 */ 33 34#include "bpfilter.h" 35 36#include <sys/param.h> 37#include <sys/systm.h> 38#include <sys/ioctl.h> 39#include <sys/mbuf.h> 40#include <sys/malloc.h> 41#include <sys/kernel.h> 42#include <sys/socket.h> 43#include <sys/syslog.h> 44 45#include <net/if.h> 46#include <net/if_dl.h> 47#include <net/if_types.h> 48 49#ifdef INET 50#include <netinet/in.h> 51#include <netinet/in_systm.h> 52#include <netinet/in_var.h> 53#include <netinet/ip.h> 54#include <netinet/if_ether.h> 55#endif 56 57#ifdef IPX 58#include <netipx/ipx.h> 59#include <netipx/ipx_if.h> 60#endif 61 62#ifdef NS 63#include <netns/ns.h> 64#include <netns/ns_if.h> 65#endif 66 67#if NBPFILTER > 0 68#include <net/bpf.h> 69#include <net/bpfdesc.h> 70#endif 71 72#include <vm/vm.h> /* for vtophys */ 73#include <vm/vm_param.h> /* for vtophys */ 74#include <vm/pmap.h> /* for vtophys */ 75#include <machine/clock.h> /* for DELAY */ 76 77#include <pci/pcivar.h> 78#include <pci/if_fxpreg.h> 79 80struct fxp_softc { 81 struct arpcom arpcom; /* per-interface network data */ 82 struct fxp_csr *csr; /* control/status registers */ 83 struct fxp_cb_tx *cbl_base; /* base of TxCB list */ 84 struct fxp_cb_tx *cbl_first; /* first active TxCB in list */ 85 struct fxp_cb_tx *cbl_last; /* last active TxCB in list */ 86 struct mbuf *rfa_headm; /* first mbuf in receive frame area */ 87 struct mbuf *rfa_tailm; /* last mbuf in receive frame area */ 88 struct fxp_stats *fxp_stats; /* Pointer to interface stats */ 89 int tx_queued; /* # of active TxCB's */ 90 int promisc_mode; /* promiscuous mode enabled */ 91}; 92 93static u_long fxp_count; 94 95/* 96 * Template for default configuration parameters. 97 * See struct fxp_cb_config for the bit definitions. 98 */ 99static u_char fxp_cb_config_template[] = { 100 0x0, 0x0, /* cb_status */ 101 0x80, 0x2, /* cb_command */ 102 0xff, 0xff, 0xff, 0xff, /* link_addr */ 103 0x16, /* 0 */ 104 0x8, /* 1 */ 105 0x0, /* 2 */ 106 0x0, /* 3 */ 107 0x0, /* 4 */ 108 0x80, /* 5 */ 109 0xb2, /* 6 */ 110 0x3, /* 7 */ 111 0x1, /* 8 */ 112 0x0, /* 9 */ 113 0x26, /* 10 */ 114 0x0, /* 11 */ 115 0x60, /* 12 */ 116 0x0, /* 13 */ 117 0xf2, /* 14 */ 118 0x48, /* 15 */ 119 0x0, /* 16 */ 120 0x40, /* 17 */ 121 0xf3, /* 18 */ 122 0x0, /* 19 */ 123 0x3f, /* 20 */ 124 0x5, /* 21 */ 125 0x0, 0x0 126}; 127 128static inline void fxp_scb_wait __P((struct fxp_csr *)); 129static char *fxp_probe __P((pcici_t, pcidi_t)); 130static void fxp_attach __P((pcici_t, int)); 131static void fxp_intr __P((void *)); 132static void fxp_start __P((struct ifnet *)); 133static int fxp_ioctl __P((struct ifnet *, int, caddr_t)); 134static void fxp_init __P((void *)); 135static void fxp_stop __P((struct fxp_softc *)); 136static void fxp_watchdog __P((struct ifnet *)); 137static void fxp_get_macaddr __P((struct fxp_softc *)); 138static int fxp_add_rfabuf __P((struct fxp_softc *, struct mbuf *)); 139static void fxp_shutdown __P((int, void *)); 140 141timeout_t fxp_stats_update; 142 143static struct pci_device fxp_device = { 144 "fxp", 145 fxp_probe, 146 fxp_attach, 147 &fxp_count, 148 NULL 149}; 150DATA_SET(pcidevice_set, fxp_device); 151 152/* 153 * Set initial transmit threshold at 64 (512 bytes). This is 154 * increased by 64 (512 bytes) at a time, to maximum of 192 155 * (1536 bytes), if an underrun occurs. 156 */ 157static int tx_threshold = 64; 158 159/* 160 * Number of transmit control blocks. This determines the number 161 * of transmit buffers that can be chained in the CB list. 162 * This must be a power of two. 163 */ 164#define FXP_NTXCB 128 165 166/* 167 * TxCB list index mask. This is used to do list wrap-around. 168 */ 169#define FXP_TXCB_MASK (FXP_NTXCB - 1) 170 171/* 172 * Number of DMA segments in a TxCB. Note that this is carefully 173 * chosen to make the total struct size an even power of two. It's 174 * critical that no TxCB be split across a page boundry since 175 * no attempt is made to allocate physically contiguous memory. 176 * 177 * XXX - don't forget to change the hard-coded constant in the 178 * fxp_cb_tx struct (defined in if_fxpreg.h), too! 179 */ 180#define FXP_NTXSEG 29 181 182/* 183 * Number of receive frame area buffers. These are large so chose 184 * wisely. 185 */ 186#define FXP_NRFABUFS 32 187 188/* 189 * Wait for the previous command to be accepted (but not necessarily 190 * completed). 191 */ 192static inline void 193fxp_scb_wait(csr) 194 struct fxp_csr *csr; 195{ 196 int i = 10000; 197 198 while ((csr->scb_command & FXP_SCB_COMMAND_MASK) && --i); 199} 200 201/* 202 * Return identification string if this is device is ours. 203 */ 204static char * 205fxp_probe(config_id, device_id) 206 pcici_t config_id; 207 pcidi_t device_id; 208{ 209 if (((device_id & 0xffff) == FXP_VENDORID_INTEL) && 210 ((device_id >> 16) & 0xffff) == FXP_DEVICEID_i82557) 211 return ("Intel EtherExpress Pro/100B Fast Ethernet"); 212 213 return NULL; 214} 215 216/* 217 * Allocate data structures and attach the device. 218 */ 219static void 220fxp_attach(config_id, unit) 221 pcici_t config_id; 222 int unit; 223{ 224 struct fxp_softc *sc; 225 struct ifnet *ifp; 226 vm_offset_t pbase; 227 int s, i; 228 229 sc = malloc(sizeof(struct fxp_softc), M_DEVBUF, M_NOWAIT); 230 if (sc == NULL) 231 return; 232 bzero(sc, sizeof(struct fxp_softc)); 233 234 s = splimp(); 235 236 /* 237 * Map control/status registers. 238 */ 239 if (!pci_map_mem(config_id, FXP_PCI_MMBA, 240 (vm_offset_t *)&sc->csr, &pbase)) { 241 printf("fxp%d: couldn't map memory\n", unit); 242 goto fail; 243 } 244 245 /*
| 28 */ 29 30/* 31 * Intel EtherExpress Pro/100B PCI Fast Ethernet driver 32 */ 33 34#include "bpfilter.h" 35 36#include <sys/param.h> 37#include <sys/systm.h> 38#include <sys/ioctl.h> 39#include <sys/mbuf.h> 40#include <sys/malloc.h> 41#include <sys/kernel.h> 42#include <sys/socket.h> 43#include <sys/syslog.h> 44 45#include <net/if.h> 46#include <net/if_dl.h> 47#include <net/if_types.h> 48 49#ifdef INET 50#include <netinet/in.h> 51#include <netinet/in_systm.h> 52#include <netinet/in_var.h> 53#include <netinet/ip.h> 54#include <netinet/if_ether.h> 55#endif 56 57#ifdef IPX 58#include <netipx/ipx.h> 59#include <netipx/ipx_if.h> 60#endif 61 62#ifdef NS 63#include <netns/ns.h> 64#include <netns/ns_if.h> 65#endif 66 67#if NBPFILTER > 0 68#include <net/bpf.h> 69#include <net/bpfdesc.h> 70#endif 71 72#include <vm/vm.h> /* for vtophys */ 73#include <vm/vm_param.h> /* for vtophys */ 74#include <vm/pmap.h> /* for vtophys */ 75#include <machine/clock.h> /* for DELAY */ 76 77#include <pci/pcivar.h> 78#include <pci/if_fxpreg.h> 79 80struct fxp_softc { 81 struct arpcom arpcom; /* per-interface network data */ 82 struct fxp_csr *csr; /* control/status registers */ 83 struct fxp_cb_tx *cbl_base; /* base of TxCB list */ 84 struct fxp_cb_tx *cbl_first; /* first active TxCB in list */ 85 struct fxp_cb_tx *cbl_last; /* last active TxCB in list */ 86 struct mbuf *rfa_headm; /* first mbuf in receive frame area */ 87 struct mbuf *rfa_tailm; /* last mbuf in receive frame area */ 88 struct fxp_stats *fxp_stats; /* Pointer to interface stats */ 89 int tx_queued; /* # of active TxCB's */ 90 int promisc_mode; /* promiscuous mode enabled */ 91}; 92 93static u_long fxp_count; 94 95/* 96 * Template for default configuration parameters. 97 * See struct fxp_cb_config for the bit definitions. 98 */ 99static u_char fxp_cb_config_template[] = { 100 0x0, 0x0, /* cb_status */ 101 0x80, 0x2, /* cb_command */ 102 0xff, 0xff, 0xff, 0xff, /* link_addr */ 103 0x16, /* 0 */ 104 0x8, /* 1 */ 105 0x0, /* 2 */ 106 0x0, /* 3 */ 107 0x0, /* 4 */ 108 0x80, /* 5 */ 109 0xb2, /* 6 */ 110 0x3, /* 7 */ 111 0x1, /* 8 */ 112 0x0, /* 9 */ 113 0x26, /* 10 */ 114 0x0, /* 11 */ 115 0x60, /* 12 */ 116 0x0, /* 13 */ 117 0xf2, /* 14 */ 118 0x48, /* 15 */ 119 0x0, /* 16 */ 120 0x40, /* 17 */ 121 0xf3, /* 18 */ 122 0x0, /* 19 */ 123 0x3f, /* 20 */ 124 0x5, /* 21 */ 125 0x0, 0x0 126}; 127 128static inline void fxp_scb_wait __P((struct fxp_csr *)); 129static char *fxp_probe __P((pcici_t, pcidi_t)); 130static void fxp_attach __P((pcici_t, int)); 131static void fxp_intr __P((void *)); 132static void fxp_start __P((struct ifnet *)); 133static int fxp_ioctl __P((struct ifnet *, int, caddr_t)); 134static void fxp_init __P((void *)); 135static void fxp_stop __P((struct fxp_softc *)); 136static void fxp_watchdog __P((struct ifnet *)); 137static void fxp_get_macaddr __P((struct fxp_softc *)); 138static int fxp_add_rfabuf __P((struct fxp_softc *, struct mbuf *)); 139static void fxp_shutdown __P((int, void *)); 140 141timeout_t fxp_stats_update; 142 143static struct pci_device fxp_device = { 144 "fxp", 145 fxp_probe, 146 fxp_attach, 147 &fxp_count, 148 NULL 149}; 150DATA_SET(pcidevice_set, fxp_device); 151 152/* 153 * Set initial transmit threshold at 64 (512 bytes). This is 154 * increased by 64 (512 bytes) at a time, to maximum of 192 155 * (1536 bytes), if an underrun occurs. 156 */ 157static int tx_threshold = 64; 158 159/* 160 * Number of transmit control blocks. This determines the number 161 * of transmit buffers that can be chained in the CB list. 162 * This must be a power of two. 163 */ 164#define FXP_NTXCB 128 165 166/* 167 * TxCB list index mask. This is used to do list wrap-around. 168 */ 169#define FXP_TXCB_MASK (FXP_NTXCB - 1) 170 171/* 172 * Number of DMA segments in a TxCB. Note that this is carefully 173 * chosen to make the total struct size an even power of two. It's 174 * critical that no TxCB be split across a page boundry since 175 * no attempt is made to allocate physically contiguous memory. 176 * 177 * XXX - don't forget to change the hard-coded constant in the 178 * fxp_cb_tx struct (defined in if_fxpreg.h), too! 179 */ 180#define FXP_NTXSEG 29 181 182/* 183 * Number of receive frame area buffers. These are large so chose 184 * wisely. 185 */ 186#define FXP_NRFABUFS 32 187 188/* 189 * Wait for the previous command to be accepted (but not necessarily 190 * completed). 191 */ 192static inline void 193fxp_scb_wait(csr) 194 struct fxp_csr *csr; 195{ 196 int i = 10000; 197 198 while ((csr->scb_command & FXP_SCB_COMMAND_MASK) && --i); 199} 200 201/* 202 * Return identification string if this is device is ours. 203 */ 204static char * 205fxp_probe(config_id, device_id) 206 pcici_t config_id; 207 pcidi_t device_id; 208{ 209 if (((device_id & 0xffff) == FXP_VENDORID_INTEL) && 210 ((device_id >> 16) & 0xffff) == FXP_DEVICEID_i82557) 211 return ("Intel EtherExpress Pro/100B Fast Ethernet"); 212 213 return NULL; 214} 215 216/* 217 * Allocate data structures and attach the device. 218 */ 219static void 220fxp_attach(config_id, unit) 221 pcici_t config_id; 222 int unit; 223{ 224 struct fxp_softc *sc; 225 struct ifnet *ifp; 226 vm_offset_t pbase; 227 int s, i; 228 229 sc = malloc(sizeof(struct fxp_softc), M_DEVBUF, M_NOWAIT); 230 if (sc == NULL) 231 return; 232 bzero(sc, sizeof(struct fxp_softc)); 233 234 s = splimp(); 235 236 /* 237 * Map control/status registers. 238 */ 239 if (!pci_map_mem(config_id, FXP_PCI_MMBA, 240 (vm_offset_t *)&sc->csr, &pbase)) { 241 printf("fxp%d: couldn't map memory\n", unit); 242 goto fail; 243 } 244 245 /*
|
246 * Issue a software reset.
| 246 * Reset to a stable state.
|
247 */
| 247 */
|
248 sc->csr->port = 0;
| 248 sc->csr->port = FXP_PORT_SELECTIVE_RESET;
|
249 DELAY(10); 250 251 /* 252 * Allocate our interrupt. 253 */ 254 if (!pci_map_int(config_id, fxp_intr, sc, &net_imask)) { 255 printf("fxp%d: couldn't map interrupt\n", unit); 256 goto fail; 257 } 258 259 sc->cbl_base = malloc(sizeof(struct fxp_cb_tx) * FXP_NTXCB, 260 M_DEVBUF, M_NOWAIT); 261 if (sc->cbl_base == NULL) 262 goto malloc_fail; 263 264 sc->fxp_stats = malloc(sizeof(struct fxp_stats), M_DEVBUF, M_NOWAIT); 265 if (sc->fxp_stats == NULL) 266 goto malloc_fail; 267 bzero(sc->fxp_stats, sizeof(struct fxp_stats)); 268 269 /* 270 * Pre-allocate our receive buffers. 271 */ 272 for (i = 0; i < FXP_NRFABUFS; i++) { 273 if (fxp_add_rfabuf(sc, NULL) != 0) { 274 goto malloc_fail; 275 } 276 } 277 278 ifp = &sc->arpcom.ac_if; 279 ifp->if_softc = sc; 280 ifp->if_unit = unit; 281 ifp->if_name = "fxp"; 282 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 283 ifp->if_ioctl = fxp_ioctl; 284 ifp->if_output = ether_output; 285 ifp->if_start = fxp_start; 286 ifp->if_watchdog = fxp_watchdog; 287 ifp->if_baudrate = 100000000; 288 ifp->if_init = fxp_init; 289 290 fxp_get_macaddr(sc); 291 printf("fxp%d: Ethernet address %6D\n", unit, 292 sc->arpcom.ac_enaddr, ":"); 293 294 /* 295 * Attach the interface. 296 */ 297 if_attach(ifp); 298 ether_ifattach(ifp); 299 300#if NBPFILTER > 0 301 bpfattach(ifp, DLT_EN10MB, sizeof(struct ether_header)); 302#endif 303 304 /* 305 * Add shutdown hook so that DMA is disabled prior to reboot. Not 306 * doing do could allow DMA to corrupt kernel memory during the 307 * reboot before the driver initializes. 308 */ 309 at_shutdown(fxp_shutdown, sc, SHUTDOWN_POST_SYNC); 310 311 splx(s); 312 return; 313 314malloc_fail: 315 printf("fxp%d: Failed to malloc memory\n", unit); 316 (void) pci_unmap_int(config_id); 317 if (sc && sc->cbl_base) 318 free(sc->cbl_base, M_DEVBUF); 319 if (sc && sc->fxp_stats) 320 free(sc->fxp_stats, M_DEVBUF); 321 /* frees entire chain */ 322 if (sc && sc->rfa_headm) 323 m_freem(sc->rfa_headm); 324fail: 325 if (sc) 326 free(sc, M_DEVBUF); 327 splx(s); 328} 329 330/* 331 * Read station (MAC) address from serial EEPROM. Basically, you 332 * manually shift in the read opcode (one bit at a time) and then 333 * shift in the address, and then you shift out the data (all of 334 * this one bit at a time). The word size is 16 bits, so you have 335 * to provide the address for every 16 bits of data. The MAC address 336 * is in the first 3 words (6 bytes total). 337 */ 338static void 339fxp_get_macaddr(sc) 340 struct fxp_softc *sc; 341{ 342 struct fxp_csr *csr; 343 u_short reg, *data; 344 int i, x; 345 346 csr = sc->csr; 347 data = (u_short *)sc->arpcom.ac_enaddr; 348 349 for (i = 0; i < 3; i++) { 350 csr->eeprom_control = FXP_EEPROM_EECS; 351 /* 352 * Shift in read opcode. 353 */ 354 for (x = 3; x > 0; x--) { 355 if (FXP_EEPROM_OPC_READ & (1 << (x - 1))) { 356 reg = FXP_EEPROM_EECS | FXP_EEPROM_EEDI; 357 } else { 358 reg = FXP_EEPROM_EECS; 359 } 360 csr->eeprom_control = reg; 361 csr->eeprom_control = reg | FXP_EEPROM_EESK; 362 DELAY(1); 363 csr->eeprom_control = reg; 364 DELAY(1); 365 } 366 /* 367 * Shift in address. 368 */ 369 for (x = 6; x > 0; x--) { 370 if (i & (1 << (x - 1))) { 371 reg = FXP_EEPROM_EECS | FXP_EEPROM_EEDI; 372 } else { 373 reg = FXP_EEPROM_EECS; 374 } 375 csr->eeprom_control = reg; 376 csr->eeprom_control = reg | FXP_EEPROM_EESK; 377 DELAY(1); 378 csr->eeprom_control = reg; 379 DELAY(1); 380 } 381 reg = FXP_EEPROM_EECS; 382 data[i] = 0; 383 /* 384 * Shift out data. 385 */ 386 for (x = 16; x > 0; x--) { 387 csr->eeprom_control = reg | FXP_EEPROM_EESK; 388 DELAY(1); 389 if (csr->eeprom_control & FXP_EEPROM_EEDO) 390 data[i] |= (1 << (x - 1)); 391 csr->eeprom_control = reg; 392 DELAY(1); 393 } 394 csr->eeprom_control = 0; 395 DELAY(1); 396 } 397} 398 399/* 400 * Device shutdown routine. Called at system shutdown after sync. The 401 * main purpose of this routine is to shut off receiver DMA so that 402 * kernel memory doesn't get clobbered during warmboot. 403 */ 404static void 405fxp_shutdown(howto, sc) 406 int howto; 407 void *sc; 408{ 409 fxp_stop((struct fxp_softc *) sc); 410} 411 412/* 413 * Start packet transmission on the interface. 414 */ 415static void 416fxp_start(ifp) 417 struct ifnet *ifp; 418{ 419 struct fxp_softc *sc = ifp->if_softc; 420 struct fxp_csr *csr = sc->csr; 421 struct fxp_cb_tx *txp; 422 struct mbuf *m, *mb_head; 423 int segment, first = 1; 424 425txloop: 426 /* 427 * See if we're all filled up with buffers to transmit. 428 */ 429 if (sc->tx_queued >= FXP_NTXCB) 430 return; 431 432 /* 433 * Grab a packet to transmit. 434 */ 435 IF_DEQUEUE(&sc->arpcom.ac_if.if_snd, mb_head); 436 if (mb_head == NULL) { 437 /* 438 * No more packets to send. 439 */ 440 return; 441 } 442 443 /* 444 * Get pointer to next available (unused) descriptor. 445 */ 446 txp = sc->cbl_last->next; 447 448 /* 449 * Go through each of the mbufs in the chain and initialize 450 * the transmit buffers descriptors with the physical address 451 * and size of the mbuf. 452 */ 453tbdinit: 454 for (m = mb_head, segment = 0; m != NULL; m = m->m_next) { 455 if (m->m_len != 0) { 456 if (segment == FXP_NTXSEG) 457 break; 458 txp->tbd[segment].tb_addr = 459 vtophys(mtod(m, vm_offset_t)); 460 txp->tbd[segment].tb_size = m->m_len; 461 segment++; 462 } 463 } 464 if (m != NULL) { 465 struct mbuf *mn; 466 467 /* 468 * We ran out of segments. We have to recopy this mbuf 469 * chain first. 470 */ 471 MGETHDR(mn, M_DONTWAIT, MT_DATA); 472 if (mn == NULL) { 473 m_freem(mb_head); 474 return; 475 } 476 if (mb_head->m_pkthdr.len > MHLEN) { 477 MCLGET(mn, M_DONTWAIT); 478 if ((mn->m_flags & M_EXT) == 0) { 479 m_freem(mn); 480 m_freem(mb_head); 481 return; 482 } 483 } 484 m_copydata(mb_head, 0, mb_head->m_pkthdr.len, mtod(mn, caddr_t)); 485 mn->m_pkthdr.len = mn->m_len = mb_head->m_pkthdr.len; 486 m_freem(mb_head); 487 mb_head = mn; 488 goto tbdinit; 489 } 490 491 txp->tbd_number = segment; 492 txp->mb_head = mb_head; 493 494 /* 495 * Finish the initialization of this TxCB. 496 */ 497 txp->cb_status = 0; 498 txp->cb_command = 499 FXP_CB_COMMAND_XMIT | FXP_CB_COMMAND_SF | FXP_CB_COMMAND_S; 500 txp->tx_threshold = tx_threshold; 501 502 /* 503 * Advance the end-of-list forward. 504 */ 505 sc->cbl_last->cb_command &= ~FXP_CB_COMMAND_S; 506 sc->cbl_last = txp; 507 508 /* 509 * Advance the beginning of the list forward if there are 510 * no other packets queued (when nothing is queued, cbl_first 511 * sits on the last TxCB that was sent out).. 512 */ 513 if (sc->tx_queued == 0) 514 sc->cbl_first = txp; 515 516 sc->tx_queued++; 517 518 /* 519 * Only need to wait prior to the first resume command. 520 */ 521 if (first) { 522 first--; 523 fxp_scb_wait(csr); 524 } 525 526 /* 527 * Resume transmission if suspended. 528 */ 529 csr->scb_command = FXP_SCB_COMMAND_CU_RESUME; 530 531#if NBPFILTER > 0 532 /* 533 * Pass packet to bpf if there is a listener. 534 */ 535 if (ifp->if_bpf) 536 bpf_mtap(ifp, mb_head); 537#endif 538 /* 539 * Set a 5 second timer just in case we don't hear from the 540 * card again. 541 */ 542 ifp->if_timer = 5; 543 544 goto txloop; 545} 546 547/* 548 * Process interface interrupts. 549 */ 550static void 551fxp_intr(arg) 552 void *arg; 553{ 554 struct fxp_softc *sc = arg; 555 struct fxp_csr *csr = sc->csr; 556 struct ifnet *ifp = &sc->arpcom.ac_if; 557 u_int8_t statack; 558 559 while ((statack = csr->scb_statack) != 0) { 560 /* 561 * First ACK all the interrupts in this pass. 562 */ 563 csr->scb_statack = statack; 564 565 /* 566 * Free any finished transmit mbuf chains. 567 */ 568 if (statack & FXP_SCB_STATACK_CNA) { 569 struct fxp_cb_tx *txp; 570 571 for (txp = sc->cbl_first; 572 (txp->cb_status & FXP_CB_STATUS_C) != 0; 573 txp = txp->next) { 574 if (txp->mb_head != NULL) { 575 m_freem(txp->mb_head); 576 txp->mb_head = NULL; 577 sc->tx_queued--; 578 } 579 if (txp->cb_command & FXP_CB_COMMAND_S) 580 break; 581 } 582 sc->cbl_first = txp; 583 /* 584 * Clear watchdog timer. It may or may not be set 585 * again in fxp_start(). 586 */ 587 ifp->if_timer = 0; 588 fxp_start(ifp); 589 } 590 /* 591 * Process receiver interrupts. If a no-resource (RNR) 592 * condition exists, get whatever packets we can and 593 * re-start the receiver. 594 */ 595 if (statack & (FXP_SCB_STATACK_FR | FXP_SCB_STATACK_RNR)) { 596 struct mbuf *m; 597 struct fxp_rfa *rfa; 598rcvloop: 599 m = sc->rfa_headm; 600 rfa = (struct fxp_rfa *)m->m_ext.ext_buf; 601 602 if (rfa->rfa_status & FXP_RFA_STATUS_C) { 603 /* 604 * Remove first packet from the chain. 605 */ 606 sc->rfa_headm = m->m_next; 607 m->m_next = NULL; 608 609 /* 610 * Add a new buffer to the receive chain. If this 611 * fails, the old buffer is recycled instead. 612 */ 613 if (fxp_add_rfabuf(sc, m) == 0) { 614 struct ether_header *eh; 615 u_short total_len; 616 617 total_len = rfa->actual_size & (MCLBYTES - 1); 618 m->m_pkthdr.rcvif = ifp; 619 m->m_pkthdr.len = m->m_len = total_len - 620 sizeof(struct ether_header); 621 eh = mtod(m, struct ether_header *); 622#if NBPFILTER > 0 623 if (ifp->if_bpf) { 624 bpf_tap(ifp, mtod(m, caddr_t), total_len); 625 /* 626 * Only pass this packet up if it is for us. 627 */ 628 if ((ifp->if_flags & IFF_PROMISC) && 629 (rfa->rfa_status & FXP_RFA_STATUS_IAMATCH) && 630 (eh->ether_dhost[0] & 1) == 0) { 631 m_freem(m); 632 goto rcvloop; 633 } 634 } 635#endif 636 m->m_data += sizeof(struct ether_header); 637 ether_input(ifp, eh, m); 638 } 639 goto rcvloop; 640 } 641 if (statack & FXP_SCB_STATACK_RNR) { 642 struct fxp_csr *csr = sc->csr; 643 644 fxp_scb_wait(csr); 645 csr->scb_general = vtophys(sc->rfa_headm->m_ext.ext_buf); 646 csr->scb_command = FXP_SCB_COMMAND_RU_START; 647 } 648 } 649 } 650} 651 652/* 653 * Update packet in/out/collision statistics. The i82557 doesn't 654 * allow you to access these counters without doing a fairly 655 * expensive DMA to get _all_ of the statistics it maintains, so 656 * we do this operation here only once per second. The statistics 657 * counters in the kernel are updated from the previous dump-stats 658 * DMA and then a new dump-stats DMA is started. The on-chip 659 * counters are zeroed when the DMA completes. If we can't start 660 * the DMA immediately, we don't wait - we just prepare to read 661 * them again next time. 662 */ 663void 664fxp_stats_update(arg) 665 void *arg; 666{ 667 struct fxp_softc *sc = arg; 668 struct ifnet *ifp = &sc->arpcom.ac_if; 669 struct fxp_stats *sp = sc->fxp_stats; 670 671 ifp->if_opackets += sp->tx_good; 672 ifp->if_collisions += sp->tx_total_collisions; 673 ifp->if_ipackets += sp->rx_good; 674 ifp->if_ierrors += 675 sp->rx_crc_errors + 676 sp->rx_alignment_errors + 677 sp->rx_rnr_errors + 678 sp->rx_overrun_errors; 679 /* 680 * If any transmit underruns occured, bump up the transmit 681 * threshold by another 512 bytes (64 * 8). 682 */ 683 if (sp->tx_underruns) { 684 ifp->if_oerrors += sp->tx_underruns; 685 if (tx_threshold < 192) 686 tx_threshold += 64; 687 } 688 /* 689 * If there is no pending command, start another stats 690 * dump. Otherwise punt for now. 691 */ 692 if ((sc->csr->scb_command & FXP_SCB_COMMAND_MASK) == 0) { 693 /* 694 * Start another stats dump. By waiting for it to be 695 * accepted, we avoid having to do splhigh locking when 696 * writing scb_command in other parts of the driver. 697 */ 698 sc->csr->scb_command = FXP_SCB_COMMAND_CU_DUMPRESET; 699 fxp_scb_wait(sc->csr); 700 } else { 701 /* 702 * A previous command is still waiting to be accepted. 703 * Just zero our copy of the stats and wait for the 704 * next timer event to update them. 705 */ 706 sp->tx_good = 0; 707 sp->tx_underruns = 0; 708 sp->tx_total_collisions = 0; 709 710 sp->rx_good = 0; 711 sp->rx_crc_errors = 0; 712 sp->rx_alignment_errors = 0; 713 sp->rx_rnr_errors = 0; 714 sp->rx_overrun_errors = 0; 715 } 716 /* 717 * Schedule another timeout one second from now. 718 */ 719 timeout(fxp_stats_update, sc, hz); 720} 721 722/* 723 * Stop the interface. Cancels the statistics updater and resets 724 * the interface. 725 */ 726static void 727fxp_stop(sc) 728 struct fxp_softc *sc; 729{ 730 struct ifnet *ifp = &sc->arpcom.ac_if; 731 struct fxp_cb_tx *txp; 732 int i; 733 734 /* 735 * Cancel stats updater. 736 */ 737 untimeout(fxp_stats_update, sc); 738 739 /* 740 * Issue software reset 741 */
| 249 DELAY(10); 250 251 /* 252 * Allocate our interrupt. 253 */ 254 if (!pci_map_int(config_id, fxp_intr, sc, &net_imask)) { 255 printf("fxp%d: couldn't map interrupt\n", unit); 256 goto fail; 257 } 258 259 sc->cbl_base = malloc(sizeof(struct fxp_cb_tx) * FXP_NTXCB, 260 M_DEVBUF, M_NOWAIT); 261 if (sc->cbl_base == NULL) 262 goto malloc_fail; 263 264 sc->fxp_stats = malloc(sizeof(struct fxp_stats), M_DEVBUF, M_NOWAIT); 265 if (sc->fxp_stats == NULL) 266 goto malloc_fail; 267 bzero(sc->fxp_stats, sizeof(struct fxp_stats)); 268 269 /* 270 * Pre-allocate our receive buffers. 271 */ 272 for (i = 0; i < FXP_NRFABUFS; i++) { 273 if (fxp_add_rfabuf(sc, NULL) != 0) { 274 goto malloc_fail; 275 } 276 } 277 278 ifp = &sc->arpcom.ac_if; 279 ifp->if_softc = sc; 280 ifp->if_unit = unit; 281 ifp->if_name = "fxp"; 282 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 283 ifp->if_ioctl = fxp_ioctl; 284 ifp->if_output = ether_output; 285 ifp->if_start = fxp_start; 286 ifp->if_watchdog = fxp_watchdog; 287 ifp->if_baudrate = 100000000; 288 ifp->if_init = fxp_init; 289 290 fxp_get_macaddr(sc); 291 printf("fxp%d: Ethernet address %6D\n", unit, 292 sc->arpcom.ac_enaddr, ":"); 293 294 /* 295 * Attach the interface. 296 */ 297 if_attach(ifp); 298 ether_ifattach(ifp); 299 300#if NBPFILTER > 0 301 bpfattach(ifp, DLT_EN10MB, sizeof(struct ether_header)); 302#endif 303 304 /* 305 * Add shutdown hook so that DMA is disabled prior to reboot. Not 306 * doing do could allow DMA to corrupt kernel memory during the 307 * reboot before the driver initializes. 308 */ 309 at_shutdown(fxp_shutdown, sc, SHUTDOWN_POST_SYNC); 310 311 splx(s); 312 return; 313 314malloc_fail: 315 printf("fxp%d: Failed to malloc memory\n", unit); 316 (void) pci_unmap_int(config_id); 317 if (sc && sc->cbl_base) 318 free(sc->cbl_base, M_DEVBUF); 319 if (sc && sc->fxp_stats) 320 free(sc->fxp_stats, M_DEVBUF); 321 /* frees entire chain */ 322 if (sc && sc->rfa_headm) 323 m_freem(sc->rfa_headm); 324fail: 325 if (sc) 326 free(sc, M_DEVBUF); 327 splx(s); 328} 329 330/* 331 * Read station (MAC) address from serial EEPROM. Basically, you 332 * manually shift in the read opcode (one bit at a time) and then 333 * shift in the address, and then you shift out the data (all of 334 * this one bit at a time). The word size is 16 bits, so you have 335 * to provide the address for every 16 bits of data. The MAC address 336 * is in the first 3 words (6 bytes total). 337 */ 338static void 339fxp_get_macaddr(sc) 340 struct fxp_softc *sc; 341{ 342 struct fxp_csr *csr; 343 u_short reg, *data; 344 int i, x; 345 346 csr = sc->csr; 347 data = (u_short *)sc->arpcom.ac_enaddr; 348 349 for (i = 0; i < 3; i++) { 350 csr->eeprom_control = FXP_EEPROM_EECS; 351 /* 352 * Shift in read opcode. 353 */ 354 for (x = 3; x > 0; x--) { 355 if (FXP_EEPROM_OPC_READ & (1 << (x - 1))) { 356 reg = FXP_EEPROM_EECS | FXP_EEPROM_EEDI; 357 } else { 358 reg = FXP_EEPROM_EECS; 359 } 360 csr->eeprom_control = reg; 361 csr->eeprom_control = reg | FXP_EEPROM_EESK; 362 DELAY(1); 363 csr->eeprom_control = reg; 364 DELAY(1); 365 } 366 /* 367 * Shift in address. 368 */ 369 for (x = 6; x > 0; x--) { 370 if (i & (1 << (x - 1))) { 371 reg = FXP_EEPROM_EECS | FXP_EEPROM_EEDI; 372 } else { 373 reg = FXP_EEPROM_EECS; 374 } 375 csr->eeprom_control = reg; 376 csr->eeprom_control = reg | FXP_EEPROM_EESK; 377 DELAY(1); 378 csr->eeprom_control = reg; 379 DELAY(1); 380 } 381 reg = FXP_EEPROM_EECS; 382 data[i] = 0; 383 /* 384 * Shift out data. 385 */ 386 for (x = 16; x > 0; x--) { 387 csr->eeprom_control = reg | FXP_EEPROM_EESK; 388 DELAY(1); 389 if (csr->eeprom_control & FXP_EEPROM_EEDO) 390 data[i] |= (1 << (x - 1)); 391 csr->eeprom_control = reg; 392 DELAY(1); 393 } 394 csr->eeprom_control = 0; 395 DELAY(1); 396 } 397} 398 399/* 400 * Device shutdown routine. Called at system shutdown after sync. The 401 * main purpose of this routine is to shut off receiver DMA so that 402 * kernel memory doesn't get clobbered during warmboot. 403 */ 404static void 405fxp_shutdown(howto, sc) 406 int howto; 407 void *sc; 408{ 409 fxp_stop((struct fxp_softc *) sc); 410} 411 412/* 413 * Start packet transmission on the interface. 414 */ 415static void 416fxp_start(ifp) 417 struct ifnet *ifp; 418{ 419 struct fxp_softc *sc = ifp->if_softc; 420 struct fxp_csr *csr = sc->csr; 421 struct fxp_cb_tx *txp; 422 struct mbuf *m, *mb_head; 423 int segment, first = 1; 424 425txloop: 426 /* 427 * See if we're all filled up with buffers to transmit. 428 */ 429 if (sc->tx_queued >= FXP_NTXCB) 430 return; 431 432 /* 433 * Grab a packet to transmit. 434 */ 435 IF_DEQUEUE(&sc->arpcom.ac_if.if_snd, mb_head); 436 if (mb_head == NULL) { 437 /* 438 * No more packets to send. 439 */ 440 return; 441 } 442 443 /* 444 * Get pointer to next available (unused) descriptor. 445 */ 446 txp = sc->cbl_last->next; 447 448 /* 449 * Go through each of the mbufs in the chain and initialize 450 * the transmit buffers descriptors with the physical address 451 * and size of the mbuf. 452 */ 453tbdinit: 454 for (m = mb_head, segment = 0; m != NULL; m = m->m_next) { 455 if (m->m_len != 0) { 456 if (segment == FXP_NTXSEG) 457 break; 458 txp->tbd[segment].tb_addr = 459 vtophys(mtod(m, vm_offset_t)); 460 txp->tbd[segment].tb_size = m->m_len; 461 segment++; 462 } 463 } 464 if (m != NULL) { 465 struct mbuf *mn; 466 467 /* 468 * We ran out of segments. We have to recopy this mbuf 469 * chain first. 470 */ 471 MGETHDR(mn, M_DONTWAIT, MT_DATA); 472 if (mn == NULL) { 473 m_freem(mb_head); 474 return; 475 } 476 if (mb_head->m_pkthdr.len > MHLEN) { 477 MCLGET(mn, M_DONTWAIT); 478 if ((mn->m_flags & M_EXT) == 0) { 479 m_freem(mn); 480 m_freem(mb_head); 481 return; 482 } 483 } 484 m_copydata(mb_head, 0, mb_head->m_pkthdr.len, mtod(mn, caddr_t)); 485 mn->m_pkthdr.len = mn->m_len = mb_head->m_pkthdr.len; 486 m_freem(mb_head); 487 mb_head = mn; 488 goto tbdinit; 489 } 490 491 txp->tbd_number = segment; 492 txp->mb_head = mb_head; 493 494 /* 495 * Finish the initialization of this TxCB. 496 */ 497 txp->cb_status = 0; 498 txp->cb_command = 499 FXP_CB_COMMAND_XMIT | FXP_CB_COMMAND_SF | FXP_CB_COMMAND_S; 500 txp->tx_threshold = tx_threshold; 501 502 /* 503 * Advance the end-of-list forward. 504 */ 505 sc->cbl_last->cb_command &= ~FXP_CB_COMMAND_S; 506 sc->cbl_last = txp; 507 508 /* 509 * Advance the beginning of the list forward if there are 510 * no other packets queued (when nothing is queued, cbl_first 511 * sits on the last TxCB that was sent out).. 512 */ 513 if (sc->tx_queued == 0) 514 sc->cbl_first = txp; 515 516 sc->tx_queued++; 517 518 /* 519 * Only need to wait prior to the first resume command. 520 */ 521 if (first) { 522 first--; 523 fxp_scb_wait(csr); 524 } 525 526 /* 527 * Resume transmission if suspended. 528 */ 529 csr->scb_command = FXP_SCB_COMMAND_CU_RESUME; 530 531#if NBPFILTER > 0 532 /* 533 * Pass packet to bpf if there is a listener. 534 */ 535 if (ifp->if_bpf) 536 bpf_mtap(ifp, mb_head); 537#endif 538 /* 539 * Set a 5 second timer just in case we don't hear from the 540 * card again. 541 */ 542 ifp->if_timer = 5; 543 544 goto txloop; 545} 546 547/* 548 * Process interface interrupts. 549 */ 550static void 551fxp_intr(arg) 552 void *arg; 553{ 554 struct fxp_softc *sc = arg; 555 struct fxp_csr *csr = sc->csr; 556 struct ifnet *ifp = &sc->arpcom.ac_if; 557 u_int8_t statack; 558 559 while ((statack = csr->scb_statack) != 0) { 560 /* 561 * First ACK all the interrupts in this pass. 562 */ 563 csr->scb_statack = statack; 564 565 /* 566 * Free any finished transmit mbuf chains. 567 */ 568 if (statack & FXP_SCB_STATACK_CNA) { 569 struct fxp_cb_tx *txp; 570 571 for (txp = sc->cbl_first; 572 (txp->cb_status & FXP_CB_STATUS_C) != 0; 573 txp = txp->next) { 574 if (txp->mb_head != NULL) { 575 m_freem(txp->mb_head); 576 txp->mb_head = NULL; 577 sc->tx_queued--; 578 } 579 if (txp->cb_command & FXP_CB_COMMAND_S) 580 break; 581 } 582 sc->cbl_first = txp; 583 /* 584 * Clear watchdog timer. It may or may not be set 585 * again in fxp_start(). 586 */ 587 ifp->if_timer = 0; 588 fxp_start(ifp); 589 } 590 /* 591 * Process receiver interrupts. If a no-resource (RNR) 592 * condition exists, get whatever packets we can and 593 * re-start the receiver. 594 */ 595 if (statack & (FXP_SCB_STATACK_FR | FXP_SCB_STATACK_RNR)) { 596 struct mbuf *m; 597 struct fxp_rfa *rfa; 598rcvloop: 599 m = sc->rfa_headm; 600 rfa = (struct fxp_rfa *)m->m_ext.ext_buf; 601 602 if (rfa->rfa_status & FXP_RFA_STATUS_C) { 603 /* 604 * Remove first packet from the chain. 605 */ 606 sc->rfa_headm = m->m_next; 607 m->m_next = NULL; 608 609 /* 610 * Add a new buffer to the receive chain. If this 611 * fails, the old buffer is recycled instead. 612 */ 613 if (fxp_add_rfabuf(sc, m) == 0) { 614 struct ether_header *eh; 615 u_short total_len; 616 617 total_len = rfa->actual_size & (MCLBYTES - 1); 618 m->m_pkthdr.rcvif = ifp; 619 m->m_pkthdr.len = m->m_len = total_len - 620 sizeof(struct ether_header); 621 eh = mtod(m, struct ether_header *); 622#if NBPFILTER > 0 623 if (ifp->if_bpf) { 624 bpf_tap(ifp, mtod(m, caddr_t), total_len); 625 /* 626 * Only pass this packet up if it is for us. 627 */ 628 if ((ifp->if_flags & IFF_PROMISC) && 629 (rfa->rfa_status & FXP_RFA_STATUS_IAMATCH) && 630 (eh->ether_dhost[0] & 1) == 0) { 631 m_freem(m); 632 goto rcvloop; 633 } 634 } 635#endif 636 m->m_data += sizeof(struct ether_header); 637 ether_input(ifp, eh, m); 638 } 639 goto rcvloop; 640 } 641 if (statack & FXP_SCB_STATACK_RNR) { 642 struct fxp_csr *csr = sc->csr; 643 644 fxp_scb_wait(csr); 645 csr->scb_general = vtophys(sc->rfa_headm->m_ext.ext_buf); 646 csr->scb_command = FXP_SCB_COMMAND_RU_START; 647 } 648 } 649 } 650} 651 652/* 653 * Update packet in/out/collision statistics. The i82557 doesn't 654 * allow you to access these counters without doing a fairly 655 * expensive DMA to get _all_ of the statistics it maintains, so 656 * we do this operation here only once per second. The statistics 657 * counters in the kernel are updated from the previous dump-stats 658 * DMA and then a new dump-stats DMA is started. The on-chip 659 * counters are zeroed when the DMA completes. If we can't start 660 * the DMA immediately, we don't wait - we just prepare to read 661 * them again next time. 662 */ 663void 664fxp_stats_update(arg) 665 void *arg; 666{ 667 struct fxp_softc *sc = arg; 668 struct ifnet *ifp = &sc->arpcom.ac_if; 669 struct fxp_stats *sp = sc->fxp_stats; 670 671 ifp->if_opackets += sp->tx_good; 672 ifp->if_collisions += sp->tx_total_collisions; 673 ifp->if_ipackets += sp->rx_good; 674 ifp->if_ierrors += 675 sp->rx_crc_errors + 676 sp->rx_alignment_errors + 677 sp->rx_rnr_errors + 678 sp->rx_overrun_errors; 679 /* 680 * If any transmit underruns occured, bump up the transmit 681 * threshold by another 512 bytes (64 * 8). 682 */ 683 if (sp->tx_underruns) { 684 ifp->if_oerrors += sp->tx_underruns; 685 if (tx_threshold < 192) 686 tx_threshold += 64; 687 } 688 /* 689 * If there is no pending command, start another stats 690 * dump. Otherwise punt for now. 691 */ 692 if ((sc->csr->scb_command & FXP_SCB_COMMAND_MASK) == 0) { 693 /* 694 * Start another stats dump. By waiting for it to be 695 * accepted, we avoid having to do splhigh locking when 696 * writing scb_command in other parts of the driver. 697 */ 698 sc->csr->scb_command = FXP_SCB_COMMAND_CU_DUMPRESET; 699 fxp_scb_wait(sc->csr); 700 } else { 701 /* 702 * A previous command is still waiting to be accepted. 703 * Just zero our copy of the stats and wait for the 704 * next timer event to update them. 705 */ 706 sp->tx_good = 0; 707 sp->tx_underruns = 0; 708 sp->tx_total_collisions = 0; 709 710 sp->rx_good = 0; 711 sp->rx_crc_errors = 0; 712 sp->rx_alignment_errors = 0; 713 sp->rx_rnr_errors = 0; 714 sp->rx_overrun_errors = 0; 715 } 716 /* 717 * Schedule another timeout one second from now. 718 */ 719 timeout(fxp_stats_update, sc, hz); 720} 721 722/* 723 * Stop the interface. Cancels the statistics updater and resets 724 * the interface. 725 */ 726static void 727fxp_stop(sc) 728 struct fxp_softc *sc; 729{ 730 struct ifnet *ifp = &sc->arpcom.ac_if; 731 struct fxp_cb_tx *txp; 732 int i; 733 734 /* 735 * Cancel stats updater. 736 */ 737 untimeout(fxp_stats_update, sc); 738 739 /* 740 * Issue software reset 741 */
|
742 sc->csr->port = 0;
| 742 sc->csr->port = FXP_PORT_SELECTIVE_RESET;
|
743 DELAY(10); 744 745 /* 746 * Release any xmit buffers. 747 */ 748 for (txp = sc->cbl_first; txp != NULL && txp->mb_head != NULL; 749 txp = txp->next) { 750 m_freem(txp->mb_head); 751 txp->mb_head = NULL; 752 } 753 sc->tx_queued = 0; 754 755 /* 756 * Free all the receive buffers then reallocate/reinitialize 757 */ 758 if (sc->rfa_headm != NULL) 759 m_freem(sc->rfa_headm); 760 sc->rfa_headm = NULL; 761 sc->rfa_tailm = NULL; 762 for (i = 0; i < FXP_NRFABUFS; i++) { 763 if (fxp_add_rfabuf(sc, NULL) != 0) { 764 /* 765 * This "can't happen" - we're at splimp() 766 * and we just freed all the buffers we need 767 * above. 768 */ 769 panic("fxp_stop: no buffers!"); 770 } 771 } 772 773 ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE); 774 ifp->if_timer = 0; 775} 776 777/* 778 * Watchdog/transmission transmit timeout handler. Called when a 779 * transmission is started on the interface, but no interrupt is 780 * received before the timeout. This usually indicates that the 781 * card has wedged for some reason. 782 */ 783static void 784fxp_watchdog(ifp) 785 struct ifnet *ifp; 786{ 787 log(LOG_ERR, "fxp%d: device timeout\n", ifp->if_unit); 788 ifp->if_oerrors++; 789 790 fxp_init(ifp->if_softc); 791} 792 793static void 794fxp_init(xsc) 795 void *xsc; 796{ 797 struct fxp_softc *sc = xsc; 798 struct ifnet *ifp = &sc->arpcom.ac_if; 799 struct fxp_cb_config *cbp; 800 struct fxp_cb_ias *cb_ias; 801 struct fxp_cb_tx *txp; 802 struct fxp_csr *csr = sc->csr; 803 int i, s, mcast, prm; 804 805 s = splimp(); 806 /* 807 * Cancel any pending I/O 808 */ 809 fxp_stop(sc); 810 811 prm = (ifp->if_flags & IFF_PROMISC) ? 1 : 0; 812 sc->promisc_mode = prm; 813 /* 814 * Sleeze out here and enable reception of all multicasts if 815 * multicasts are enabled. Ideally, we'd program the multicast 816 * address filter to only accept specific multicasts. 817 */ 818 mcast = (ifp->if_flags & (IFF_MULTICAST|IFF_ALLMULTI)) ? 1 : 0; 819 820 /* 821 * Initialize base of CBL and RFA memory. Loading with zero 822 * sets it up for regular linear addressing. 823 */ 824 csr->scb_general = 0; 825 csr->scb_command = FXP_SCB_COMMAND_CU_BASE; 826 827 fxp_scb_wait(csr); 828 csr->scb_command = FXP_SCB_COMMAND_RU_BASE; 829 830 /* 831 * Initialize base of dump-stats buffer. 832 */ 833 fxp_scb_wait(csr); 834 csr->scb_general = vtophys(sc->fxp_stats); 835 csr->scb_command = FXP_SCB_COMMAND_CU_DUMP_ADR; 836 837 /* 838 * We temporarily use memory that contains the TxCB list to 839 * construct the config CB. The TxCB list memory is rebuilt 840 * later. 841 */ 842 cbp = (struct fxp_cb_config *) sc->cbl_base; 843 844 /* 845 * This bcopy is kind of disgusting, but there are a bunch of must be 846 * zero and must be one bits in this structure and this is the easiest 847 * way to initialize them all to proper values. 848 */ 849 bcopy(fxp_cb_config_template, cbp, sizeof(struct fxp_cb_config)); 850 851 cbp->cb_status = 0; 852 cbp->cb_command = FXP_CB_COMMAND_CONFIG | FXP_CB_COMMAND_EL; 853 cbp->link_addr = -1; /* (no) next command */ 854 cbp->byte_count = 22; /* (22) bytes to config */ 855 cbp->rx_fifo_limit = 8; /* rx fifo threshold */ 856 cbp->tx_fifo_limit = 0; /* tx fifo threshold */ 857 cbp->adaptive_ifs = 0; /* (no) adaptive interframe spacing */ 858 cbp->rx_dma_bytecount = 16; /* (no) rx DMA max */ 859 cbp->tx_dma_bytecount = 16; /* (no) tx DMA max */ 860 cbp->dma_bce = 1; /* (enable) dma max counters */ 861 cbp->late_scb = 0; /* (don't) defer SCB update */ 862 cbp->tno_int = 0; /* (disable) tx not okay interrupt */ 863 cbp->ci_int = 0; /* (do) interrupt on CU not active */ 864 cbp->save_bf = prm; /* save bad frames */ 865 cbp->disc_short_rx = !prm; /* discard short packets */ 866 cbp->underrun_retry = 1; /* retry mode (1) on DMA underrun */ 867 cbp->mediatype = 1; /* (MII) interface mode */ 868 cbp->nsai = 1; /* (don't) disable source addr insert */ 869 cbp->preamble_length = 2; /* (7 byte) preamble */ 870 cbp->loopback = 0; /* (don't) loopback */ 871 cbp->linear_priority = 0; /* (normal CSMA/CD operation) */ 872 cbp->linear_pri_mode = 0; /* (wait after xmit only) */ 873 cbp->interfrm_spacing = 6; /* (96 bits of) interframe spacing */ 874 cbp->promiscuous = prm; /* promiscuous mode */ 875 cbp->bcast_disable = 0; /* (don't) disable broadcasts */ 876 cbp->crscdt = 1; /* (CRS only) */ 877 cbp->stripping = !prm; /* truncate rx packet to byte count */ 878 cbp->padding = 1; /* (do) pad short tx packets */ 879 cbp->rcv_crc_xfer = 0; /* (don't) xfer CRC to host */ 880 cbp->force_fdx = 0; /* (don't) force full duplex */ 881 cbp->fdx_pin_en = 1; /* (enable) FDX# pin */ 882 cbp->multi_ia = 0; /* (don't) accept multiple IAs */ 883 cbp->mc_all = mcast; /* accept all multicasts */ 884 885 /* 886 * Start the config command/DMA. 887 */ 888 fxp_scb_wait(csr); 889 csr->scb_general = vtophys(cbp); 890 csr->scb_command = FXP_SCB_COMMAND_CU_START; 891 /* ...and wait for it to complete. */ 892 while (!(cbp->cb_status & FXP_CB_STATUS_C)); 893 894 /* 895 * Now initialize the station address. Temporarily use the TxCB 896 * memory area like we did above for the config CB. 897 */ 898 cb_ias = (struct fxp_cb_ias *) sc->cbl_base; 899 cb_ias->cb_status = 0; 900 cb_ias->cb_command = FXP_CB_COMMAND_IAS | FXP_CB_COMMAND_EL; 901 cb_ias->link_addr = -1; 902 bcopy(sc->arpcom.ac_enaddr, (void *)cb_ias->macaddr, 903 sizeof(sc->arpcom.ac_enaddr)); 904 905 /* 906 * Start the IAS (Individual Address Setup) command/DMA. 907 */ 908 fxp_scb_wait(csr); 909 csr->scb_command = FXP_SCB_COMMAND_CU_START; 910 /* ...and wait for it to complete. */ 911 while (!(cb_ias->cb_status & FXP_CB_STATUS_C)); 912 913 /* 914 * Initialize transmit control block (TxCB) list. 915 */ 916 917 txp = sc->cbl_base; 918 bzero(txp, sizeof(struct fxp_cb_tx) * FXP_NTXCB); 919 for (i = 0; i < FXP_NTXCB; i++) { 920 txp[i].cb_status = FXP_CB_STATUS_C | FXP_CB_STATUS_OK; 921 txp[i].cb_command = FXP_CB_COMMAND_NOP; 922 txp[i].link_addr = vtophys(&txp[(i + 1) & FXP_TXCB_MASK]); 923 txp[i].tbd_array_addr = vtophys(&txp[i].tbd[0]); 924 txp[i].next = &txp[(i + 1) & FXP_TXCB_MASK]; 925 } 926 /* 927 * Set the stop flag on the first TxCB and start the control 928 * unit. It will execute the NOP and then suspend. 929 */ 930 txp->cb_command = FXP_CB_COMMAND_NOP | FXP_CB_COMMAND_S; 931 sc->cbl_first = sc->cbl_last = txp; 932 sc->tx_queued = 0; 933 934 fxp_scb_wait(csr); 935 csr->scb_command = FXP_SCB_COMMAND_CU_START; 936 937 /* 938 * Initialize receiver buffer area - RFA. 939 */ 940 fxp_scb_wait(csr); 941 csr->scb_general = vtophys(sc->rfa_headm->m_ext.ext_buf); 942 csr->scb_command = FXP_SCB_COMMAND_RU_START; 943 944 ifp->if_flags |= IFF_RUNNING; 945 ifp->if_flags &= ~IFF_OACTIVE; 946 splx(s); 947 948 /* 949 * Start stats updater. 950 */ 951 timeout(fxp_stats_update, sc, hz); 952} 953 954/* 955 * Add a buffer to the end of the RFA buffer list. 956 * Return 0 if successful, 1 for failure. A failure results in 957 * adding the 'oldm' (if non-NULL) on to the end of the list - 958 * tossing out it's old contents and recycling it. 959 * The RFA struct is stuck at the beginning of mbuf cluster and the 960 * data pointer is fixed up to point just past it. 961 */ 962static int 963fxp_add_rfabuf(sc, oldm) 964 struct fxp_softc *sc; 965 struct mbuf *oldm; 966{ 967 struct mbuf *m; 968 struct fxp_rfa *rfa, *p_rfa; 969 970 MGETHDR(m, M_DONTWAIT, MT_DATA); 971 if (m != NULL) { 972 MCLGET(m, M_DONTWAIT); 973 if ((m->m_flags & M_EXT) == 0) { 974 m_freem(m); 975 if (oldm == NULL) 976 return 1; 977 m = oldm; 978 m->m_data = m->m_ext.ext_buf; 979 } 980 } else { 981 if (oldm == NULL) 982 return 1; 983 m = oldm; 984 m->m_data = m->m_ext.ext_buf; 985 } 986 /* 987 * Get a pointer to the base of the mbuf cluster and move 988 * data start past it. 989 */ 990 rfa = mtod(m, struct fxp_rfa *); 991 m->m_data += sizeof(struct fxp_rfa); 992 rfa->size = MCLBYTES - sizeof(struct fxp_rfa); 993 994 rfa->rfa_status = 0; 995 rfa->rfa_control = FXP_RFA_CONTROL_EL; 996 rfa->link_addr = -1; 997 rfa->rbd_addr = -1; 998 rfa->actual_size = 0; 999 /* 1000 * If there are other buffers already on the list, attach this 1001 * one to the end by fixing up the tail to point to this one. 1002 */ 1003 if (sc->rfa_headm != NULL) { 1004 p_rfa = (struct fxp_rfa *) sc->rfa_tailm->m_ext.ext_buf; 1005 sc->rfa_tailm->m_next = m; 1006 p_rfa->link_addr = vtophys(rfa); 1007 p_rfa->rfa_control &= ~FXP_RFA_CONTROL_EL; 1008 } else { 1009 sc->rfa_headm = m; 1010 } 1011 sc->rfa_tailm = m; 1012 1013 return (m == oldm); 1014} 1015 1016static int 1017fxp_ioctl(ifp, command, data) 1018 struct ifnet *ifp; 1019 int command; 1020 caddr_t data; 1021{ 1022 struct ifaddr *ifa = (struct ifaddr *) data; 1023 struct fxp_softc *sc = ifp->if_softc; 1024 struct ifreq *ifr = (struct ifreq *) data; 1025 int s, error = 0; 1026 1027 s = splimp(); 1028 1029 switch (command) { 1030 1031 case SIOCSIFADDR: 1032 case SIOCGIFADDR: 1033 case SIOCSIFMTU: 1034 error = ether_ioctl(ifp, command, data); 1035 break; 1036 1037 case SIOCSIFFLAGS: 1038 1039 /* 1040 * If interface is marked up and not running, then start it. 1041 * If it is marked down and running, stop it. 1042 * XXX If it's up then re-initialize it. This is so flags 1043 * such as IFF_PROMISC are handled. 1044 */ 1045 if (ifp->if_flags & IFF_UP) { 1046 fxp_init(sc); 1047 } else { 1048 if (ifp->if_flags & IFF_RUNNING) 1049 fxp_stop(sc); 1050 } 1051 break; 1052 1053 case SIOCADDMULTI: 1054 case SIOCDELMULTI: 1055 /* 1056 * Multicast list has changed; set the hardware filter 1057 * accordingly. 1058 */ 1059 fxp_init(sc); 1060 error = 0; 1061 break; 1062 1063 default: 1064 error = EINVAL; 1065 } 1066 (void) splx(s); 1067 return (error); 1068}
| 743 DELAY(10); 744 745 /* 746 * Release any xmit buffers. 747 */ 748 for (txp = sc->cbl_first; txp != NULL && txp->mb_head != NULL; 749 txp = txp->next) { 750 m_freem(txp->mb_head); 751 txp->mb_head = NULL; 752 } 753 sc->tx_queued = 0; 754 755 /* 756 * Free all the receive buffers then reallocate/reinitialize 757 */ 758 if (sc->rfa_headm != NULL) 759 m_freem(sc->rfa_headm); 760 sc->rfa_headm = NULL; 761 sc->rfa_tailm = NULL; 762 for (i = 0; i < FXP_NRFABUFS; i++) { 763 if (fxp_add_rfabuf(sc, NULL) != 0) { 764 /* 765 * This "can't happen" - we're at splimp() 766 * and we just freed all the buffers we need 767 * above. 768 */ 769 panic("fxp_stop: no buffers!"); 770 } 771 } 772 773 ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE); 774 ifp->if_timer = 0; 775} 776 777/* 778 * Watchdog/transmission transmit timeout handler. Called when a 779 * transmission is started on the interface, but no interrupt is 780 * received before the timeout. This usually indicates that the 781 * card has wedged for some reason. 782 */ 783static void 784fxp_watchdog(ifp) 785 struct ifnet *ifp; 786{ 787 log(LOG_ERR, "fxp%d: device timeout\n", ifp->if_unit); 788 ifp->if_oerrors++; 789 790 fxp_init(ifp->if_softc); 791} 792 793static void 794fxp_init(xsc) 795 void *xsc; 796{ 797 struct fxp_softc *sc = xsc; 798 struct ifnet *ifp = &sc->arpcom.ac_if; 799 struct fxp_cb_config *cbp; 800 struct fxp_cb_ias *cb_ias; 801 struct fxp_cb_tx *txp; 802 struct fxp_csr *csr = sc->csr; 803 int i, s, mcast, prm; 804 805 s = splimp(); 806 /* 807 * Cancel any pending I/O 808 */ 809 fxp_stop(sc); 810 811 prm = (ifp->if_flags & IFF_PROMISC) ? 1 : 0; 812 sc->promisc_mode = prm; 813 /* 814 * Sleeze out here and enable reception of all multicasts if 815 * multicasts are enabled. Ideally, we'd program the multicast 816 * address filter to only accept specific multicasts. 817 */ 818 mcast = (ifp->if_flags & (IFF_MULTICAST|IFF_ALLMULTI)) ? 1 : 0; 819 820 /* 821 * Initialize base of CBL and RFA memory. Loading with zero 822 * sets it up for regular linear addressing. 823 */ 824 csr->scb_general = 0; 825 csr->scb_command = FXP_SCB_COMMAND_CU_BASE; 826 827 fxp_scb_wait(csr); 828 csr->scb_command = FXP_SCB_COMMAND_RU_BASE; 829 830 /* 831 * Initialize base of dump-stats buffer. 832 */ 833 fxp_scb_wait(csr); 834 csr->scb_general = vtophys(sc->fxp_stats); 835 csr->scb_command = FXP_SCB_COMMAND_CU_DUMP_ADR; 836 837 /* 838 * We temporarily use memory that contains the TxCB list to 839 * construct the config CB. The TxCB list memory is rebuilt 840 * later. 841 */ 842 cbp = (struct fxp_cb_config *) sc->cbl_base; 843 844 /* 845 * This bcopy is kind of disgusting, but there are a bunch of must be 846 * zero and must be one bits in this structure and this is the easiest 847 * way to initialize them all to proper values. 848 */ 849 bcopy(fxp_cb_config_template, cbp, sizeof(struct fxp_cb_config)); 850 851 cbp->cb_status = 0; 852 cbp->cb_command = FXP_CB_COMMAND_CONFIG | FXP_CB_COMMAND_EL; 853 cbp->link_addr = -1; /* (no) next command */ 854 cbp->byte_count = 22; /* (22) bytes to config */ 855 cbp->rx_fifo_limit = 8; /* rx fifo threshold */ 856 cbp->tx_fifo_limit = 0; /* tx fifo threshold */ 857 cbp->adaptive_ifs = 0; /* (no) adaptive interframe spacing */ 858 cbp->rx_dma_bytecount = 16; /* (no) rx DMA max */ 859 cbp->tx_dma_bytecount = 16; /* (no) tx DMA max */ 860 cbp->dma_bce = 1; /* (enable) dma max counters */ 861 cbp->late_scb = 0; /* (don't) defer SCB update */ 862 cbp->tno_int = 0; /* (disable) tx not okay interrupt */ 863 cbp->ci_int = 0; /* (do) interrupt on CU not active */ 864 cbp->save_bf = prm; /* save bad frames */ 865 cbp->disc_short_rx = !prm; /* discard short packets */ 866 cbp->underrun_retry = 1; /* retry mode (1) on DMA underrun */ 867 cbp->mediatype = 1; /* (MII) interface mode */ 868 cbp->nsai = 1; /* (don't) disable source addr insert */ 869 cbp->preamble_length = 2; /* (7 byte) preamble */ 870 cbp->loopback = 0; /* (don't) loopback */ 871 cbp->linear_priority = 0; /* (normal CSMA/CD operation) */ 872 cbp->linear_pri_mode = 0; /* (wait after xmit only) */ 873 cbp->interfrm_spacing = 6; /* (96 bits of) interframe spacing */ 874 cbp->promiscuous = prm; /* promiscuous mode */ 875 cbp->bcast_disable = 0; /* (don't) disable broadcasts */ 876 cbp->crscdt = 1; /* (CRS only) */ 877 cbp->stripping = !prm; /* truncate rx packet to byte count */ 878 cbp->padding = 1; /* (do) pad short tx packets */ 879 cbp->rcv_crc_xfer = 0; /* (don't) xfer CRC to host */ 880 cbp->force_fdx = 0; /* (don't) force full duplex */ 881 cbp->fdx_pin_en = 1; /* (enable) FDX# pin */ 882 cbp->multi_ia = 0; /* (don't) accept multiple IAs */ 883 cbp->mc_all = mcast; /* accept all multicasts */ 884 885 /* 886 * Start the config command/DMA. 887 */ 888 fxp_scb_wait(csr); 889 csr->scb_general = vtophys(cbp); 890 csr->scb_command = FXP_SCB_COMMAND_CU_START; 891 /* ...and wait for it to complete. */ 892 while (!(cbp->cb_status & FXP_CB_STATUS_C)); 893 894 /* 895 * Now initialize the station address. Temporarily use the TxCB 896 * memory area like we did above for the config CB. 897 */ 898 cb_ias = (struct fxp_cb_ias *) sc->cbl_base; 899 cb_ias->cb_status = 0; 900 cb_ias->cb_command = FXP_CB_COMMAND_IAS | FXP_CB_COMMAND_EL; 901 cb_ias->link_addr = -1; 902 bcopy(sc->arpcom.ac_enaddr, (void *)cb_ias->macaddr, 903 sizeof(sc->arpcom.ac_enaddr)); 904 905 /* 906 * Start the IAS (Individual Address Setup) command/DMA. 907 */ 908 fxp_scb_wait(csr); 909 csr->scb_command = FXP_SCB_COMMAND_CU_START; 910 /* ...and wait for it to complete. */ 911 while (!(cb_ias->cb_status & FXP_CB_STATUS_C)); 912 913 /* 914 * Initialize transmit control block (TxCB) list. 915 */ 916 917 txp = sc->cbl_base; 918 bzero(txp, sizeof(struct fxp_cb_tx) * FXP_NTXCB); 919 for (i = 0; i < FXP_NTXCB; i++) { 920 txp[i].cb_status = FXP_CB_STATUS_C | FXP_CB_STATUS_OK; 921 txp[i].cb_command = FXP_CB_COMMAND_NOP; 922 txp[i].link_addr = vtophys(&txp[(i + 1) & FXP_TXCB_MASK]); 923 txp[i].tbd_array_addr = vtophys(&txp[i].tbd[0]); 924 txp[i].next = &txp[(i + 1) & FXP_TXCB_MASK]; 925 } 926 /* 927 * Set the stop flag on the first TxCB and start the control 928 * unit. It will execute the NOP and then suspend. 929 */ 930 txp->cb_command = FXP_CB_COMMAND_NOP | FXP_CB_COMMAND_S; 931 sc->cbl_first = sc->cbl_last = txp; 932 sc->tx_queued = 0; 933 934 fxp_scb_wait(csr); 935 csr->scb_command = FXP_SCB_COMMAND_CU_START; 936 937 /* 938 * Initialize receiver buffer area - RFA. 939 */ 940 fxp_scb_wait(csr); 941 csr->scb_general = vtophys(sc->rfa_headm->m_ext.ext_buf); 942 csr->scb_command = FXP_SCB_COMMAND_RU_START; 943 944 ifp->if_flags |= IFF_RUNNING; 945 ifp->if_flags &= ~IFF_OACTIVE; 946 splx(s); 947 948 /* 949 * Start stats updater. 950 */ 951 timeout(fxp_stats_update, sc, hz); 952} 953 954/* 955 * Add a buffer to the end of the RFA buffer list. 956 * Return 0 if successful, 1 for failure. A failure results in 957 * adding the 'oldm' (if non-NULL) on to the end of the list - 958 * tossing out it's old contents and recycling it. 959 * The RFA struct is stuck at the beginning of mbuf cluster and the 960 * data pointer is fixed up to point just past it. 961 */ 962static int 963fxp_add_rfabuf(sc, oldm) 964 struct fxp_softc *sc; 965 struct mbuf *oldm; 966{ 967 struct mbuf *m; 968 struct fxp_rfa *rfa, *p_rfa; 969 970 MGETHDR(m, M_DONTWAIT, MT_DATA); 971 if (m != NULL) { 972 MCLGET(m, M_DONTWAIT); 973 if ((m->m_flags & M_EXT) == 0) { 974 m_freem(m); 975 if (oldm == NULL) 976 return 1; 977 m = oldm; 978 m->m_data = m->m_ext.ext_buf; 979 } 980 } else { 981 if (oldm == NULL) 982 return 1; 983 m = oldm; 984 m->m_data = m->m_ext.ext_buf; 985 } 986 /* 987 * Get a pointer to the base of the mbuf cluster and move 988 * data start past it. 989 */ 990 rfa = mtod(m, struct fxp_rfa *); 991 m->m_data += sizeof(struct fxp_rfa); 992 rfa->size = MCLBYTES - sizeof(struct fxp_rfa); 993 994 rfa->rfa_status = 0; 995 rfa->rfa_control = FXP_RFA_CONTROL_EL; 996 rfa->link_addr = -1; 997 rfa->rbd_addr = -1; 998 rfa->actual_size = 0; 999 /* 1000 * If there are other buffers already on the list, attach this 1001 * one to the end by fixing up the tail to point to this one. 1002 */ 1003 if (sc->rfa_headm != NULL) { 1004 p_rfa = (struct fxp_rfa *) sc->rfa_tailm->m_ext.ext_buf; 1005 sc->rfa_tailm->m_next = m; 1006 p_rfa->link_addr = vtophys(rfa); 1007 p_rfa->rfa_control &= ~FXP_RFA_CONTROL_EL; 1008 } else { 1009 sc->rfa_headm = m; 1010 } 1011 sc->rfa_tailm = m; 1012 1013 return (m == oldm); 1014} 1015 1016static int 1017fxp_ioctl(ifp, command, data) 1018 struct ifnet *ifp; 1019 int command; 1020 caddr_t data; 1021{ 1022 struct ifaddr *ifa = (struct ifaddr *) data; 1023 struct fxp_softc *sc = ifp->if_softc; 1024 struct ifreq *ifr = (struct ifreq *) data; 1025 int s, error = 0; 1026 1027 s = splimp(); 1028 1029 switch (command) { 1030 1031 case SIOCSIFADDR: 1032 case SIOCGIFADDR: 1033 case SIOCSIFMTU: 1034 error = ether_ioctl(ifp, command, data); 1035 break; 1036 1037 case SIOCSIFFLAGS: 1038 1039 /* 1040 * If interface is marked up and not running, then start it. 1041 * If it is marked down and running, stop it. 1042 * XXX If it's up then re-initialize it. This is so flags 1043 * such as IFF_PROMISC are handled. 1044 */ 1045 if (ifp->if_flags & IFF_UP) { 1046 fxp_init(sc); 1047 } else { 1048 if (ifp->if_flags & IFF_RUNNING) 1049 fxp_stop(sc); 1050 } 1051 break; 1052 1053 case SIOCADDMULTI: 1054 case SIOCDELMULTI: 1055 /* 1056 * Multicast list has changed; set the hardware filter 1057 * accordingly. 1058 */ 1059 fxp_init(sc); 1060 error = 0; 1061 break; 1062 1063 default: 1064 error = EINVAL; 1065 } 1066 (void) splx(s); 1067 return (error); 1068}
|