9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston,
25 #include <exec/types.h>
26 #include <exec/libraries.h>
27 #include <exec/semaphores.h>
28 #include <exec/devices.h>
29 #include <exec/interrupts.h>
36 #include <devices/timer.h>
37 #include <devices/sana2.h>
38 #include <devices/sana2specialstats.h>
40 #include <proto/exec.h>
41 #include <aros/debug.h>
43 #include LC_LIBDEFS_FILE
45 #define VIARHINE_TASK_NAME "VIA-RHINE task"
46 #define VIARHINE_PORT_NAME "VIA-RHINE port"
51 #define BUFFER_SIZE 2048L /* Enough to hold a 1536 Frame */
52 #define MAX_FRAME_SIZE 1536 /* 1536 */
53 #define MAX_MULTI 32 /* Hardware Related, Do not change */
55 /** Device Driver Structures **/
58 struct Device rhineb_Device
;
59 struct MsgPort
*rhineb_syncport
;
61 OOP_Object
*rhineb_pci
;
62 OOP_Object
*rhineb_irq
;
63 OOP_AttrBase rhineb_pciDeviceAttrBase
;
65 struct Sana2DeviceQuery rhineb_Sana2Info
;
66 struct VIARHINEUnit
*rhineb_unit
;
68 /* UnitCount is used to assign unit ID's to found hardware ..*/
69 unsigned int rhineb_UnitCount
;
72 #undef HiddPCIDeviceAttrBase
73 #define HiddPCIDeviceAttrBase (LIBBASE->rhineb_pciDeviceAttrBase)
86 struct MsgPort read_port
;
87 BOOL (*rx_function
)(APTR
, APTR
, ULONG
);
88 BOOL (*tx_function
)(APTR
, APTR
, ULONG
);
89 struct Hook
*filter_hook
;
90 struct MinList initial_stats
;
97 struct Sana2PacketTypeStats stats
;
105 struct Sana2PacketTypeStats stats
;
114 ULONG lower_bound_left
;
115 ULONG upper_bound_left
;
116 UWORD lower_bound_right
;
117 UWORD upper_bound_right
;
122 struct VIARHINEUnit
{
123 struct MinNode
*rhineu_Node
;
124 struct MinList rhineu_Openers
;
125 struct MinList rhineu_multicast_ranges
;
126 struct MinList rhineu_type_trackers
;
127 ULONG rhineu_UnitNum
;
128 LONG rhineu_range_count
;
130 OOP_Object
*rhineu_PCIDevice
;
131 OOP_Object
*rhineu_PCIDriver
;
133 struct timeval rhineu_toutPOLL
;
134 BOOL rhineu_toutNEED
;
135 BOOL rhineu_IntsAdded
;
137 struct MsgPort
*rhineu_TimerSlowPort
;
138 struct timerequest
*rhineu_TimerSlowReq
;
140 struct MsgPort
*rhineu_TimerFastPort
;
141 struct timerequest
*rhineu_TimerFastReq
;
143 struct Sana2DeviceStats rhineu_stats
;
144 ULONG rhineu_special_stats
[STAT_COUNT
];
146 char *rhineu_cardname
;
147 int rhineu_chipcapabilities
;
149 ULONG rhineu_rtl_LinkSpeed
;
150 #define support_fdx (1 << 0) // Supports Full Duplex
151 #define support_mii (1 << 1)
152 #define support_fset (1 << 2)
153 #define support_ltint (1 << 3)
154 #define support_dxsuflo (1 << 4)
156 void (*initialize
)(struct VIARHINEUnit
*);
157 void (*deinitialize
)(struct VIARHINEUnit
*);
158 int (*start
)(struct VIARHINEUnit
*);
159 int (*stop
)(struct VIARHINEUnit
*);
160 int (*alloc_rx
)(struct VIARHINEUnit
*);
161 void (*set_mac_address
)(struct VIARHINEUnit
*);
162 void (*linkchange
)(struct VIARHINEUnit
*);
163 void (*linkirq
)(struct VIARHINEUnit
*);
164 // ULONG (*descr_getlength)(struct ring_desc *prd, ULONG v);
165 void (*set_multicast
)(struct VIARHINEUnit
*);
167 int rhineu_open_count
;
168 struct SignalSemaphore rhineu_unit_lock
;
170 struct Process
*rhineu_Process
;
172 struct VIARHINEBase
*rhineu_device
;
173 struct Interrupt rhineu_irqhandler
;
174 struct Interrupt rhineu_touthandler
;
175 IPTR rhineu_DeviceID
;
176 IPTR rhineu_DriverFlags
;
182 BYTE rhineu_signal_0
;
183 BYTE rhineu_signal_1
;
184 BYTE rhineu_signal_2
;
185 BYTE rhineu_signal_3
;
187 struct MsgPort
*rhineu_input_port
;
189 struct MsgPort
*rhineu_request_ports
[REQUEST_QUEUE_COUNT
];
191 struct Interrupt rhineu_rx_int
;
192 struct Interrupt rhineu_tx_int
;
199 UBYTE rhineu_dev_addr
[6];
200 UBYTE rhineu_org_addr
[6];
201 struct fe_priv
*rhineu_fe_priv
;
204 void handle_request(LIBBASETYPEPTR
, struct IOSana2Req
*);
206 /* Media selection options. */
217 /* These flag bits are private to the generic network queueing
218 * layer, they may not be explicitly referenced by any other
226 __LINK_STATE_PRESENT
,
228 __LINK_STATE_NOCARRIER
,
229 __LINK_STATE_RX_SCHED
,
230 __LINK_STATE_LINKWATCH_PENDING
233 static inline int test_bit(int nr
, const volatile ULONG
*addr
)
235 return ((1UL << (nr
& 31)) & (addr
[nr
>> 5])) != 0;
238 static inline void set_bit(int nr
, volatile ULONG
*addr
)
240 addr
[nr
>> 5] |= 1UL << (nr
& 31);
243 static inline void clear_bit(int nr
, volatile ULONG
*addr
)
245 addr
[nr
>> 5] &= ~(1UL << (nr
& 31));
248 static inline int test_and_set_bit(int nr
, volatile ULONG
*addr
)
250 int oldbit
= test_bit(nr
, addr
);
255 static inline int test_and_clear_bit(int nr
, volatile ULONG
*addr
)
257 int oldbit
= test_bit(nr
, addr
);
262 static inline void netif_schedule(struct VIARHINEUnit
*dev
)
264 if (!test_bit(__LINK_STATE_XOFF
, &dev
->rhineu_state
)) {
265 Cause(&dev
->rhineu_tx_int
);
270 static inline void netif_start_queue(struct VIARHINEUnit
*dev
)
272 clear_bit(__LINK_STATE_XOFF
, &dev
->rhineu_state
);
275 static inline void netif_wake_queue(struct VIARHINEUnit
*dev
)
277 if (test_and_clear_bit(__LINK_STATE_XOFF
, &dev
->rhineu_state
)) {
278 Cause(&dev
->rhineu_tx_int
);
282 static inline void netif_stop_queue(struct VIARHINEUnit
*dev
)
284 set_bit(__LINK_STATE_XOFF
, &dev
->rhineu_state
);
287 static inline int netif_queue_stopped(const struct VIARHINEUnit
*dev
)
289 return test_bit(__LINK_STATE_XOFF
, &dev
->rhineu_state
);
292 static inline int netif_running(const struct VIARHINEUnit
*dev
)
294 return test_bit(__LINK_STATE_START
, &dev
->rhineu_state
);
297 static inline int netif_carrier_ok(const struct VIARHINEUnit
*dev
)
299 return !test_bit(__LINK_STATE_NOCARRIER
, &dev
->rhineu_state
);
302 extern void __netdev_watchdog_up(struct VIARHINEUnit
*dev
);
304 static inline void netif_carrier_on(struct VIARHINEUnit
*dev
)
306 if (test_and_clear_bit(__LINK_STATE_NOCARRIER
, &dev
->rhineu_state
)) {
307 // linkwatch_fire_event(dev);
309 if (netif_running(dev
)) {
310 // __netdev_watchdog_up(dev);
314 static inline void netif_carrier_off(struct VIARHINEUnit
*dev
)
316 if (!test_and_set_bit(__LINK_STATE_NOCARRIER
, &dev
->rhineu_state
)) {
317 // linkwatch_fire_event(dev);
321 /* Standard interface flags (netdevice->flags). */
322 #define IFF_UP 0x1 /* interface is up */
323 #define IFF_BROADCAST 0x2 /* broadcast address valid */
324 #define IFF_DEBUG 0x4 /* turn on debugging */
325 #define IFF_LOOPBACK 0x8 /* is a loopback net */
326 #define IFF_POINTOPOINT 0x10 /* interface is has p-p link */
327 #define IFF_NOTRAILERS 0x20 /* avoid use of trailers */
328 #define IFF_RUNNING 0x40 /* resources allocated */
329 #define IFF_NOARP 0x80 /* no ARP protocol */
330 #define IFF_PROMISC 0x100 /* receive all packets */
331 #define IFF_ALLMULTI 0x200 /* receive all multicast packets*/
333 #define IFF_MASTER 0x400 /* master of a load balancer */
334 #define IFF_SLAVE 0x800 /* slave of a load balancer */
336 #define IFF_MULTICAST 0x1000 /* Supports multicast */
338 #define IFF_VOLATILE (IFF_LOOPBACK|IFF_POINTOPOINT|IFF_BROADCAST|IFF_MASTER|IFF_SLAVE|IFF_RUNNING)
340 #define IFF_PORTSEL 0x2000 /* can set media type */
341 #define IFF_AUTOMEDIA 0x4000 /* auto media select active */
342 #define IFF_DYNAMIC 0x8000 /* dialup device with changing addresses*/
343 #define IFF_SHARED 0x10000 /* interface may be shared */
344 #define IFF_CONFIGURED 0x20000 /* interface already configured */
347 * We tag multicasts with these structures.
350 #define MAX_ADDR_LEN 32
354 struct dev_mc_list
*next
;
355 UBYTE dmi_addr
[MAX_ADDR_LEN
];
356 unsigned char dmi_addrlen
;
386 /* Start - via rhine new */
387 viarhine_rx_desc rx_desc
[RX_BUFFERS
]; /* RX Frame Descriptors */
388 viarhine_tx_desc tx_desc
[TX_BUFFERS
]; /* TX Frame Descriptors */
390 struct eth_frame
*rx_buffer
;
394 struct eth_frame
*tx_buffer
;
400 char mii_phys
[4]; //MII device address
401 unsigned short mii_advertising
; //NWay media advertising
404 /* End - via rhine new */
406 struct VIARHINEUnit
*pci_dev
;
414 unsigned int phy_oui
;
417 struct SignalSemaphore lock
;
423 ULONG cur_rx
, refill_rx
;
425 ULONG next_tx
, nic_tx
;
429 ULONG need_linktimer
;
430 struct timeval link_timeout
;
434 #define pci_name(unit) (unit->rhineu_name)
439 #define ETH_DATA_LEN 1500
441 #define ETH_ADDRESSSIZE 6
442 #define ETH_HEADERSIZE 14
443 #define ETH_CRCSIZE 4
444 #define ETH_MTU (ETH_DATA_LEN)
445 #define ETH_MAXPACKETSIZE ((ETH_HEADERSIZE) + (ETH_MTU) + (ETH_CRCSIZE))
447 #define ETH_PACKET_DEST 0
448 #define ETH_PACKET_SOURCE 6
449 #define ETH_PACKET_TYPE 12
450 #define ETH_PACKET_IEEELEN 12
451 #define ETH_PACKET_SNAPTYPE 20
452 #define ETH_PACKET_DATA 14
453 #define ETH_PACKET_CRC (ETH_PACKET_DATA + ETH_MTU)
455 #define RXTX_ALLOC_BUFSIZE (ETH_MAXPACKETSIZE + 26)
457 #define TX_LIMIT_STOP 63
458 #define TX_LIMIT_START 62
461 UBYTE eth_packet_dest
[6];
462 UBYTE eth_packet_source
[6];
463 UWORD eth_packet_type
;
464 UBYTE eth_packet_data
[ETH_MTU
];
465 UBYTE eth_packet_crc
[4];
466 UBYTE eth_pad
[RXTX_ALLOC_BUFSIZE
- ETH_MAXPACKETSIZE
];
467 } __attribute__((packed
));
468 #define eth_packet_ieeelen eth_packet_type
470 void viarhinenic_get_functions(struct VIARHINEUnit
*Unit
);
472 /* **************************** */
473 /* OLD PCNET32 DEFINES */
474 /* **************************** */
476 #ifndef PCNET32_LOG_TX_BUFFERS
477 #define PCNET32_LOG_TX_BUFFERS 3
478 #define PCNET32_LOG_RX_BUFFERS 4
481 #define TX_RING_SIZE (1 << (PCNET32_LOG_TX_BUFFERS))
482 #define TX_RING_MOD_MASK (TX_RING_SIZE - 1)
483 #define TX_RING_LEN_BITS ((PCNET32_LOG_TX_BUFFERS) << 12)
485 #define RX_RING_SIZE (1 << (PCNET32_LOG_RX_BUFFERS))
486 #define RX_RING_MOD_MASK (RX_RING_SIZE - 1)
487 #define RX_RING_LEN_BITS ((PCNET32_LOG_RX_BUFFERS) << 4)
489 /* ***************************** */
490 /* REAL VIA RHINE DEFINES */
491 /* ***************************** */
496 enum viarhine_chip_capability_flags
504 enum viarhine_register_offsets
506 VIAR_StationAddr
= 0x00,
507 VIAR_RxConfig
= 0x06,
508 VIAR_TxConfig
= 0x07,
510 VIAR_IntrStatus
= 0x0C,
511 VIAR_IntrEnable
= 0x0E,
512 VIAR_MulticastFilter0
= 0x10,
513 VIAR_MulticastFilter1
= 0x14,
514 VIAR_RxRingPtr
= 0x18,
515 VIAR_TxRingPtr
= 0x1C,
516 VIAR_MIIPhyAddr
= 0x6C,
517 VIAR_MIIStatus
= 0x6D,
518 VIAR_PCIBusConfig
= 0x6E,
520 VIAR_MIIRegAddr
= 0x71,
523 VIAR_RxMissed
= 0x7C,
524 VIAR_RxCRCErrs
= 0x7E,
530 enum viarhine_chip_cmd_bits
537 CmdTxDemand
= 0x0020,
538 CmdRxDemand
= 0x0040,
542 CmdNoTxPoll
= 0x0800,
547 * Interrupt Status Bits
549 enum viarhine_intr_status_bits
553 IntrRxEmpty
= 0x0020,
555 IntrTxAbort
= 0x0008,
556 IntrTxUnderrun
= 0x0010,
558 IntrStatsMax
= 0x0080,
559 IntrRxEarly
= 0x0100,
560 IntrMIIChange
= 0x0200,
561 IntrRxOverflow
= 0x0400,
562 IntrRxDropped
= 0x0800,
563 IntrRxNoBuf
= 0x1000,
564 IntrTxAborted
= 0x2000,
565 IntrLinkChange
= 0x4000,
566 IntrRxWakeUp
= 0x8000,
567 IntrNormalSummary
= 0x0003,
568 IntrAbnormalSummary
= 0xC260,
574 enum viarhine_rx_status_bits
584 enum viarhine_desc_status_bits
586 DescOwn
= 0x80000000,
587 DescEndPacket
= 0x4000,
591 /** Serial EEPROM section **/
595 #define EE_SHIFT_CLK 0x04 // EEPROM shift clock
596 #define EE_CS 0x08 // EEPROM chip select
597 #define EE_DATA_WRITE 0x02 // EEPROM chip data in
598 #define EE_WRITE_0 0x00
599 #define EE_WRITE_1 0x02
600 #define EE_DATA_READ 0x01 // EEPROM chip data out
601 #define EE_ENB (0x80 | EE_CS)
603 // Delay between EEPROM clock transitions.
604 // No extra delay is needed with 33Mhz PCI, but 66Mhz may change this.
606 #define eeprom_delay(ee_addr) LONGIN(ee_addr)
608 // The EEPROM commands include the alway-set leading bit
610 #define EE_WRITE_CMD (5)
611 #define EE_READ_CMD (6)
612 #define EE_ERASE_CMD (7)
614 /** MII serial management **/
616 // Read and write the MII management registers using software-generated
617 // serial MDIO protocol.
618 // The maximum data clock rate is 2.5 Mhz. The minimum timing is usually
619 // met by back-to-back PCI I/O cycles, but we insert a delay to avoid
620 // "overclocking" issues
622 #define MDIO_DIR 0x80
623 #define MDIO_DATA_OUT 0x04
624 #define MDIO_DATA_IN 0x02
625 #define MDIO_CLK 0x01
626 #define MDIO_WRITE0 (MDIO_DIR)
627 #define MDIO_WRITE1 (MDIO_DIR | MDIO_DATA_OUT)
629 #define mdio_delay(mdio_addr) LONGIN(mdio_addr)