4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
22 * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
33 #include <sys/types.h>
34 #include <sys/stream.h>
35 #include <sys/strsun.h>
36 #include <sys/strsubr.h>
39 #include <sys/pci_cap.h>
41 #include <sys/modctl.h>
42 #include <sys/kstat.h>
43 #include <sys/ethernet.h>
45 #include <sys/errno.h>
47 #include <sys/devops.h>
48 #include <sys/debug.h>
51 #include <netinet/ip6.h>
52 #include <inet/common.h>
56 #include <sys/pattr.h>
59 #include <sys/sunddi.h>
61 #include <sys/mac_provider.h>
62 #include <sys/mac_ether.h>
65 * Reconfiguring the network devices requires the net_config privilege
68 extern int secpolicy_net_config(const cred_t
*, boolean_t
);
70 #include <sys/netlb.h> /* originally from cassini */
71 #include <sys/miiregs.h> /* by fjlite out of intel */
78 #define RGE_DRIVER_NAME "rge"
81 * The driver supports the NDD ioctls ND_GET/ND_SET, and the loopback
82 * ioctls LB_GET_INFO_SIZE/LB_GET_INFO/LB_GET_MODE/LB_SET_MODE
84 * These are the values to use with LD_SET_MODE.
86 #define RGE_LOOP_NONE 0
87 #define RGE_LOOP_INTERNAL_PHY 1
88 #define RGE_LOOP_INTERNAL_MAC 2
91 * RGE-specific ioctls ...
93 #define RGE_IOC ((((('R' << 8) + 'G') << 8) + 'E') << 8)
96 * PHY register read/write ioctls, used by cable test software
98 #define RGE_MII_READ (RGE_IOC|1)
99 #define RGE_MII_WRITE (RGE_IOC|2)
102 uint32_t mii_reg
; /* PHY register number [0..31] */
103 uint32_t mii_data
; /* data to write/data read */
107 * These diagnostic IOCTLS are enabled only in DEBUG drivers
109 #define RGE_DIAG (RGE_IOC|10) /* currently a no-op */
110 #define RGE_PEEK (RGE_IOC|11)
111 #define RGE_POKE (RGE_IOC|12)
112 #define RGE_PHY_RESET (RGE_IOC|13)
113 #define RGE_SOFT_RESET (RGE_IOC|14)
114 #define RGE_HARD_RESET (RGE_IOC|15)
117 uint64_t pp_acc_size
; /* in bytes: 1,2,4,8 */
118 uint64_t pp_acc_space
; /* See #defines below */
119 uint64_t pp_acc_offset
;
120 uint64_t pp_acc_data
; /* output for peek */
124 #define RGE_PP_SPACE_CFG 0 /* PCI config space */
125 #define RGE_PP_SPACE_REG 1 /* PCI memory space */
126 #define RGE_PP_SPACE_MII 2 /* PHY's MII registers */
127 #define RGE_PP_SPACE_RGE 3 /* driver's soft state */
128 #define RGE_PP_SPACE_TXDESC 4 /* TX descriptors */
129 #define RGE_PP_SPACE_TXBUFF 5 /* TX buffers */
130 #define RGE_PP_SPACE_RXDESC 6 /* RX descriptors */
131 #define RGE_PP_SPACE_RXBUFF 7 /* RX buffers */
132 #define RGE_PP_SPACE_STATISTICS 8 /* statistics block */
137 #define RGE_HASH_POLY 0x04C11DB7 /* 0x04C11DB6 */
138 #define RGE_HASH_CRC 0xFFFFFFFFU
139 #define RGE_MCAST_BUF_SIZE 64 /* multicast hash table size in bits */
142 * Rx/Tx buffer parameters
144 #define RGE_BUF_SLOTS 2048
145 #define RGE_RECV_COPY_SIZE 256
146 #define RGE_HEADROOM 6
149 * Driver chip operation parameters
151 #define RGE_CYCLIC_PERIOD (1000000000) /* ~1s */
152 #define CHIP_RESET_LOOP 1000
153 #define PHY_RESET_LOOP 10
154 #define STATS_DUMP_LOOP 1000
155 #define RXBUFF_FREE_LOOP 1000
156 #define RGE_RX_INT_TIME 128
157 #define RGE_RX_INT_PKTS 8
160 * Named Data (ND) Parameter Management Structure
168 } nd_param_t
; /* 0x18 (24) bytes */
171 * NDD parameter indexes, divided into:
173 * read-only parameters describing the hardware's capabilities
174 * read-write parameters controlling the advertised capabilities
175 * read-only parameters describing the partner's capabilities
176 * read-only parameters describing the link state
179 PARAM_AUTONEG_CAP
= 0,
181 PARAM_ASYM_PAUSE_CAP
,
190 PARAM_ADV_AUTONEG_CAP
,
192 PARAM_ADV_ASYM_PAUSE_CAP
,
193 PARAM_ADV_1000FDX_CAP
,
194 PARAM_ADV_1000HDX_CAP
,
196 PARAM_ADV_100FDX_CAP
,
197 PARAM_ADV_100HDX_CAP
,
210 enum rge_chip_state
{
211 RGE_CHIP_FAULT
= -2, /* fault, need reset */
212 RGE_CHIP_ERROR
, /* error, want reset */
213 RGE_CHIP_INITIAL
, /* Initial state only */
214 RGE_CHIP_RESET
, /* reset, need init */
215 RGE_CHIP_STOPPED
, /* Tx/Rx stopped */
216 RGE_CHIP_RUNNING
/* with interrupts */
228 RGE_GET_MAC
, /* get mac address operation */
229 RGE_SET_MAC
, /* set mac address operation */
230 RGE_SET_MUL
, /* set multicast address op */
231 RGE_SET_PROMISC
/* set promisc mode */
235 * (Internal) return values from ioctl subroutines
238 IOC_INVAL
= -1, /* bad, NAK with EINVAL */
239 IOC_DONE
, /* OK, reply sent */
240 IOC_ACK
, /* OK, just send ACK */
241 IOC_REPLY
, /* OK, just send reply */
242 IOC_RESTART_ACK
, /* OK, restart & ACK */
243 IOC_RESTART_REPLY
/* OK, restart & reply */
247 * (Internal) enumeration of this driver's kstats
250 RGE_KSTAT_DRIVER
= 0,
255 * Basic data types, for clarity in distinguishing 'numbers'
256 * used for different purposes ...
258 * A <rge_regno_t> is a register 'address' (offset) in any one of
259 * various address spaces (PCI config space, PCI memory-mapped I/O
260 * register space, MII registers, etc). None of these exceeds 64K,
261 * so we could use a 16-bit representation but pointer-sized objects
262 * are more "natural" in most architectures; they seem to be handled
263 * more efficiently on SPARC and no worse on x86.
265 * RGE_REGNO_NONE represents the non-existent value in this space.
267 typedef uintptr_t rge_regno_t
; /* register # (offset) */
268 #define RGE_REGNO_NONE (~(uintptr_t)0u)
271 * Describes one chunk of allocated DMA-able memory
273 * In some cases, this is a single chunk as allocated from the system;
274 * but we also use this structure to represent slices carved off such
275 * a chunk. Even when we don't really need all the information, we
276 * use this structure as a convenient way of correlating the various
277 * ways of looking at a piece of memory (kernel VA, IO space DVMA,
278 * handle+offset, etc).
281 ddi_acc_handle_t acc_hdl
; /* handle for memory */
282 void *mem_va
; /* CPU VA of memory */
283 uint32_t nslots
; /* number of slots */
284 uint32_t size
; /* size per slot */
285 size_t alength
; /* allocated size */
286 ddi_dma_handle_t dma_hdl
; /* DMA handle */
287 offset_t offset
; /* relative to handle */
288 ddi_dma_cookie_t cookie
; /* associated cookie */
289 uint32_t ncookies
; /* must be 1 */
290 uint32_t token
; /* arbitrary identifier */
294 * Software version of the Receive Buffer Descriptor
297 caddr_t
private; /* pointer to rge */
298 dma_area_t pbuf
; /* (const) related */
300 frtn_t rx_recycle
; /* recycle function */
304 typedef struct sw_rbd
{
310 * Software version of the Send Buffer Descriptor
312 typedef struct sw_sbd
{
313 dma_area_t desc
; /* (const) related h/w */
314 /* descriptor area */
315 dma_area_t pbuf
; /* (const) related */
320 #define HW_RBD_INIT(rbd, slot) { \
321 (rbd)->vlan_tag = 0; \
322 if ((slot) == (RGE_RECV_SLOTS -1)) { \
323 (rbd)->flags_len |= \
324 RGE_BSWAP_32(BD_FLAG_EOR | BD_FLAG_HW_OWN); \
326 (rbd)->flags_len |= RGE_BSWAP_32(BD_FLAG_HW_OWN); \
329 #define HW_SBD_SET(sbd, slot) { \
330 if ((slot) == (RGE_SEND_SLOTS -1)) { \
331 (sbd)->flags_len |= \
332 RGE_BSWAP_32(BD_FLAG_EOR | SBD_FLAG_TX_PKT); \
334 (sbd)->flags_len |= RGE_BSWAP_32(SBD_FLAG_TX_PKT); \
339 * Describes the characteristics of a specific chip
342 uint16_t command
; /* saved during attach */
343 uint16_t vendor
; /* vendor-id */
344 uint16_t device
; /* device-id */
345 uint16_t subven
; /* subsystem-vendor-id */
346 uint16_t subdev
; /* subsystem-id */
347 uint8_t revision
; /* revision-id */
348 uint8_t clsize
; /* cache-line-size */
349 uint8_t latency
; /* latency-timer */
351 boolean_t enable_mac_first
;
358 typedef struct rge_stats
{
364 uint32_t defer
; /* dot3StatsDeferredTransmissions */
365 uint32_t crc_err
; /* dot3StatsFCSErrors */
367 uint32_t no_rcvbuf
; /* ifInDiscards */
368 uint32_t intr
; /* interrupt count */
371 boolean_t tx_pre_ismax
;
372 boolean_t tx_cur_ismax
;
376 * Per-instance soft-state structure
379 dev_info_t
*devinfo
; /* device instance */
380 mac_handle_t mh
; /* mac module handle */
381 ddi_acc_handle_t cfg_handle
; /* DDI I/O handle */
382 ddi_acc_handle_t io_handle
; /* DDI I/O handle */
383 caddr_t io_regs
; /* mapped registers */
384 ddi_periodic_t periodic_id
; /* periodical callback */
385 ddi_softint_handle_t resched_hdl
; /* reschedule callback */
386 ddi_softint_handle_t factotum_hdl
; /* factotum callback */
388 ddi_intr_handle_t
*htable
; /* For array of interrupts */
389 int intr_type
; /* What type of interrupt */
390 int intr_rqst
; /* # of request intrs count */
391 int intr_cnt
; /* # of intrs count returned */
392 uint_t intr_pri
; /* Interrupt priority */
393 int intr_cap
; /* Interrupt capabilities */
394 boolean_t msi_enable
;
396 uint32_t ethmax_size
;
397 uint32_t default_mtu
;
402 char ifname
[8]; /* "rge0" ... "rge999" */
404 uint32_t progress
; /* attach tracking */
405 uint32_t debug
; /* per-instance debug */
409 * These structures describe the blocks of memory allocated during
410 * attach(). They remain unchanged thereafter, although the memory
411 * they describe is carved up into various separate regions and may
412 * therefore be described by other structures as well.
414 dma_area_t dma_area_rxdesc
;
415 dma_area_t dma_area_txdesc
;
416 dma_area_t dma_area_stats
;
417 /* describes hardware statistics area */
419 uint8_t netaddr
[ETHERADDRL
]; /* mac address */
420 uint16_t int_mask
; /* interrupt mask */
422 /* used for multicast/promisc mode set */
423 char mcast_refs
[RGE_MCAST_BUF_SIZE
];
424 uint8_t mcast_hash
[RGE_MCAST_NUM
];
425 boolean_t promisc
; /* promisc state flag */
431 uint32_t rx_next
; /* current rx bd index */
433 sw_rbd_t
*free_srbds
;
434 uint32_t rf_next
; /* current free buf index */
435 uint32_t rc_next
; /* current recycle buf index */
436 uint32_t rx_free
; /* number of rx free buf */
441 uint32_t tx_free
; /* number of free tx bd */
442 uint32_t tx_next
; /* current tx bd index */
443 uint32_t tc_next
; /* current tx recycle index */
449 kmutex_t genlock
[1]; /* i/o reg access */
450 krwlock_t errlock
[1]; /* rge restart */
451 kmutex_t tx_lock
[1]; /* send access */
452 kmutex_t tc_lock
[1]; /* send recycle access */
453 kmutex_t rx_lock
[1]; /* receive access */
454 kmutex_t rc_lock
[1]; /* receive recycle access */
457 * Miscellaneous operating variables (not synchronised)
459 uint32_t watchdog
; /* watches for Tx stall */
460 boolean_t resched_needed
;
461 uint32_t factotum_flag
; /* softint pending */
466 rge_regno_t phy_mii_addr
; /* should be (const) 1! */
467 uint16_t link_down_count
;
470 * NDD parameters (protected by genlock)
473 nd_param_t nd_params
[PARAM_COUNT
];
476 * Driver kstats, protected by <genlock> where necessary
478 kstat_t
*rge_kstats
[RGE_KSTAT_COUNT
];
481 rge_hw_stats_t
*hw_stats
;
483 enum rge_mac_state rge_mac_state
; /* definitions above */
484 enum rge_chip_state rge_chip_state
; /* definitions above */
491 #define TX_COALESC max(RGE_BUF_SLOTS/32LL, 8)
492 #define RX_COALESC 8LL
496 uint64_t last_opackets
;
497 uint64_t last_rpackets
;
498 uint32_t rx_fifo_ovf
;
502 * 'Progress' bit flags ...
504 #define PROGRESS_CFG 0x0001 /* config space mapped */
505 #define PROGRESS_REGS 0x0002 /* registers mapped */
506 #define PROGRESS_RESCHED 0x0010 /* resched softint registered */
507 #define PROGRESS_FACTOTUM 0x0020 /* factotum softint registered */
508 #define PROGRESS_INTR 0X0040 /* h/w interrupt registered */
509 /* and mutexen initialised */
510 #define PROGRESS_INIT 0x0080 /* rx/buf/tx ring initialised */
511 #define PROGRESS_PHY 0x0100 /* PHY initialised */
512 #define PROGRESS_NDD 0x1000 /* NDD parameters set up */
513 #define PROGRESS_KSTATS 0x2000 /* kstats created */
514 #define PROGRESS_READY 0x8000 /* ready for work */
519 #define CHIP_FLAG_FORCE_BCOPY 0x10000000
522 * Shorthand for the NDD parameters
524 #define param_adv_autoneg nd_params[PARAM_ADV_AUTONEG_CAP].ndp_val
525 #define param_adv_pause nd_params[PARAM_ADV_PAUSE_CAP].ndp_val
526 #define param_adv_asym_pause nd_params[PARAM_ADV_ASYM_PAUSE_CAP].ndp_val
527 #define param_adv_1000fdx nd_params[PARAM_ADV_1000FDX_CAP].ndp_val
528 #define param_adv_1000hdx nd_params[PARAM_ADV_1000HDX_CAP].ndp_val
529 #define param_adv_100fdx nd_params[PARAM_ADV_100FDX_CAP].ndp_val
530 #define param_adv_100hdx nd_params[PARAM_ADV_100HDX_CAP].ndp_val
531 #define param_adv_10fdx nd_params[PARAM_ADV_10FDX_CAP].ndp_val
532 #define param_adv_10hdx nd_params[PARAM_ADV_10HDX_CAP].ndp_val
534 #define param_link_up nd_params[PARAM_LINK_STATUS].ndp_val
535 #define param_link_speed nd_params[PARAM_LINK_SPEED].ndp_val
536 #define param_link_duplex nd_params[PARAM_LINK_DUPLEX].ndp_val
538 #define param_loop_mode nd_params[PARAM_LOOP_MODE].ndp_val
541 * Sync a DMA area described by a dma_area_t
543 #define DMA_SYNC(area, flag) ((void) ddi_dma_sync((area).dma_hdl, \
544 (area).offset, (area).alength, (flag)))
547 * Find the (kernel virtual) address of block of memory
548 * described by a dma_area_t
550 #define DMA_VPTR(area) ((area).mem_va)
553 * Zero a block of memory described by a dma_area_t
555 #define DMA_ZERO(area) bzero(DMA_VPTR(area), (area).alength)
558 * Next/Last value of a cyclic index
560 #define NEXT(index, limit) ((index)+1 < (limit) ? (index)+1 : 0);
561 #define LAST(index, limit) ((index) ? (index)-1 : (limit - 1));
565 #define RGE_PROP_EXISTS(d, n) ddi_prop_exists(DDI_DEV_T_ANY, (d), \
566 DDI_PROP_DONTPASS, (n))
567 #define RGE_PROP_GET_INT(d, n) ddi_prop_get_int(DDI_DEV_T_ANY, (d), \
568 DDI_PROP_DONTPASS, (n), -1)
574 #define RGE_BSWAP_16(x) ((((x) & 0xff00) >> 8) | \
575 (((x) & 0x00ff) << 8))
576 #define RGE_BSWAP_32(x) ((((x) & 0xff000000) >> 24) | \
577 (((x) & 0x00ff0000) >> 8) | \
578 (((x) & 0x0000ff00) << 8) | \
579 (((x) & 0x000000ff) << 24))
580 #define RGE_BSWAP_64(x) (RGE_BSWAP_32((x) >> 32) | \
581 (RGE_BSWAP_32(x) << 32))
583 #define RGE_BSWAP_16(x) (x)
584 #define RGE_BSWAP_32(x) (x)
585 #define RGE_BSWAP_64(x) (x)
589 * Bit test macros, returning boolean_t values
591 #define BIS(w, b) (((w) & (b)) ? B_TRUE : B_FALSE)
592 #define BIC(w, b) (((w) & (b)) ? B_FALSE : B_TRUE)
593 #define UPORDOWN(x) ((x) ? "up" : "down")
596 * Bit flags in the 'debug' word ...
598 #define RGE_DBG_STOP 0x00000001 /* early debug_enter() */
599 #define RGE_DBG_TRACE 0x00000002 /* general flow tracing */
601 #define RGE_DBG_REGS 0x00000010 /* low-level accesses */
602 #define RGE_DBG_MII 0x00000020 /* low-level MII access */
603 #define RGE_DBG_SEEPROM 0x00000040 /* low-level SEEPROM IO */
604 #define RGE_DBG_CHIP 0x00000080 /* low(ish)-level code */
606 #define RGE_DBG_RECV 0x00000100 /* receive-side code */
607 #define RGE_DBG_SEND 0x00000200 /* packet-send code */
609 #define RGE_DBG_INT 0x00001000 /* interrupt handler */
610 #define RGE_DBG_FACT 0x00002000 /* factotum (softint) */
612 #define RGE_DBG_PHY 0x00010000 /* Copper PHY code */
613 #define RGE_DBG_SERDES 0x00020000 /* SerDes code */
614 #define RGE_DBG_PHYS 0x00040000 /* Physical layer code */
615 #define RGE_DBG_LINK 0x00080000 /* Link status check */
617 #define RGE_DBG_INIT 0x00100000 /* initialisation */
618 #define RGE_DBG_NEMO 0x00200000 /* nemo interaction */
619 #define RGE_DBG_ADDR 0x00400000 /* address-setting code */
620 #define RGE_DBG_STATS 0x00800000 /* statistics */
622 #define RGE_DBG_IOCTL 0x01000000 /* ioctl handling */
623 #define RGE_DBG_LOOP 0x02000000 /* loopback ioctl code */
624 #define RGE_DBG_PPIO 0x04000000 /* Peek/poke ioctls */
625 #define RGE_DBG_BADIOC 0x08000000 /* unknown ioctls */
627 #define RGE_DBG_MCTL 0x10000000 /* mctl (csum) code */
628 #define RGE_DBG_NDD 0x20000000 /* NDD operations */
634 #define RGE_DEBUGGING 1
636 #define RGE_DEBUGGING 0
641 * 'Do-if-debugging' macro. The parameter <command> should be one or more
642 * C statements (but without the *final* semicolon), which will either be
643 * compiled inline or completely ignored, depending on the RGE_DEBUGGING
646 * You should get a compile-time error (at least on a DEBUG build) if
647 * your statement isn't actually a statement, rather than unexpected
648 * run-time behaviour caused by unintended matching of if-then-elses etc.
650 * Note that the RGE_DDB() macro itself can only be used as a statement,
651 * not an expression, and should always be followed by a semicolon.
654 #define RGE_DDB(command) do { \
656 _NOTE(CONSTANTCONDITION) \
658 #else /* RGE_DEBUGGING */
659 #define RGE_DDB(command) do { \
661 _NOTE(CONSTANTCONDITION) \
663 #endif /* RGE_DEBUGGING */
666 * 'Internal' macros used to construct the TRACE/DEBUG macros below.
667 * These provide the primitive conditional-call capability required.
668 * Note: the parameter <args> is a parenthesised list of the actual
669 * printf-style arguments to be passed to the debug function ...
671 #define RGE_XDB(b, w, f, args) RGE_DDB(if ((b) & (w)) f args)
672 #define RGE_GDB(b, args) RGE_XDB(b, rge_debug, (*rge_gdb()), args)
673 #define RGE_LDB(b, args) RGE_XDB(b, rgep->debug, (*rge_db(rgep)), args)
674 #define RGE_CDB(f, args) RGE_XDB(RGE_DBG, rgep->debug, f, args)
677 * Conditional-print macros.
679 * Define RGE_DBG to be the relevant member of the set of RGE_DBG_* values
680 * above before using the RGE_GDEBUG() or RGE_DEBUG() macros. The 'G'
681 * versions look at the Global debug flag word (rge_debug); the non-G
682 * versions look in the per-instance data (rgep->debug) and so require a
683 * variable called 'rgep' to be in scope (and initialised!) before use.
685 * You could redefine RGE_TRC too if you really need two different
686 * flavours of debugging output in the same area of code, but I don't
687 * really recommend it.
689 * Note: the parameter <args> is a parenthesised list of the actual
690 * arguments to be passed to the debug function, usually a printf-style
691 * format string and corresponding values to be formatted.
694 #define RGE_TRC RGE_DBG_TRACE /* default 'trace' bit */
695 #define RGE_GTRACE(args) RGE_GDB(RGE_TRC, args)
696 #define RGE_GDEBUG(args) RGE_GDB(RGE_DBG, args)
697 #define RGE_TRACE(args) RGE_LDB(RGE_TRC, args)
698 #define RGE_DEBUG(args) RGE_LDB(RGE_DBG, args)
701 * Debug-only action macros
703 #define RGE_BRKPT(rgep, s) RGE_DDB(rge_dbg_enter(rgep, s))
704 #define RGE_MARK(rgep) RGE_DDB(rge_led_mark(rgep))
705 #define RGE_PCICHK(rgep) RGE_DDB(rge_pci_check(rgep))
706 #define RGE_PKTDUMP(args) RGE_DDB(rge_pkt_dump args)
707 #define RGE_REPORT(args) RGE_DDB(rge_log args)
710 * Inter-source-file linkage ...
714 uint16_t rge_mii_get16(rge_t
*rgep
, uintptr_t mii
);
715 void rge_mii_put16(rge_t
*rgep
, uintptr_t mii
, uint16_t data
);
716 void rge_chip_cfg_init(rge_t
*rgep
, chip_id_t
*cidp
);
717 void rge_chip_ident(rge_t
*rgep
);
718 int rge_chip_reset(rge_t
*rgep
);
719 void rge_chip_init(rge_t
*rgep
);
720 void rge_chip_start(rge_t
*rgep
);
721 void rge_chip_stop(rge_t
*rgep
, boolean_t fault
);
722 void rge_chip_sync(rge_t
*rgep
, enum rge_sync_op todo
);
723 void rge_chip_blank(void *arg
, time_t ticks
, uint_t count
, int flag
);
724 void rge_tx_trigger(rge_t
*rgep
);
725 void rge_hw_stats_dump(rge_t
*rgep
);
726 uint_t
rge_intr(caddr_t arg1
, caddr_t arg2
);
727 uint_t
rge_chip_factotum(caddr_t arg1
, caddr_t arg2
);
728 void rge_chip_cyclic(void *arg
);
729 enum ioc_reply
rge_chip_ioctl(rge_t
*rgep
, queue_t
*wq
, mblk_t
*mp
,
730 struct iocblk
*iocp
);
731 boolean_t
rge_phy_reset(rge_t
*rgep
);
732 void rge_phy_init(rge_t
*rgep
);
733 void rge_phy_update(rge_t
*rgep
);
736 void rge_init_kstats(rge_t
*rgep
, int instance
);
737 void rge_fini_kstats(rge_t
*rgep
);
738 int rge_m_stat(void *arg
, uint_t stat
, uint64_t *val
);
742 void (*rge_db(rge_t
*rgep
))(const char *fmt
, ...);
743 void (*rge_gdb(void))(const char *fmt
, ...);
744 void rge_pkt_dump(rge_t
*rgep
, rge_bd_t
*hbp
, sw_rbd_t
*sdp
, const char *msg
);
745 void rge_dbg_enter(rge_t
*rgep
, const char *msg
);
746 #endif /* RGE_DEBUGGING */
747 void rge_problem(rge_t
*rgep
, const char *fmt
, ...);
748 void rge_notice(rge_t
*rgep
, const char *fmt
, ...);
749 void rge_log(rge_t
*rgep
, const char *fmt
, ...);
750 void rge_error(rge_t
*rgep
, const char *fmt
, ...);
751 extern kmutex_t rge_log_mutex
[1];
752 extern uint32_t rge_debug
;
755 void rge_restart(rge_t
*rgep
);
758 int rge_nd_init(rge_t
*rgep
);
759 enum ioc_reply
rge_nd_ioctl(rge_t
*rgep
, queue_t
*wq
, mblk_t
*mp
,
760 struct iocblk
*iocp
);
761 void rge_nd_cleanup(rge_t
*rgep
);
764 void rge_rx_recycle(caddr_t arg
);
765 void rge_receive(rge_t
*rgep
);
766 void rge_send_recycle(rge_t
*rgep
);
767 mblk_t
*rge_m_tx(void *arg
, mblk_t
*mp
);
768 uint_t
rge_reschedule(caddr_t arg1
, caddr_t arg2
);