74#define sis900_bufs NIC_FAKE_BSS ( struct sis900_bss )
75#define txd sis900_bufs.txd
76#define rxd sis900_bufs.rxd
77#define txb sis900_bufs.txb
78#define rxb sis900_bufs.rxb
81static struct mac_chip_info {
86 {
"SiS 900 PCI Fast Ethernet", PCI_VENDOR_ID_SIS, PCI_DEVICE_ID_SIS900,
88 {
"SiS 7016 PCI Fast Ethernet",PCI_VENDOR_ID_SIS, PCI_DEVICE_ID_SIS7016,
130 { .vendor = 0x1039, .device = 0x0008,
131 .name =
"SIS 85C503/5513 PCI to ISA bridge"},
134PCI_DRIVER( sis_bridge_pci_driver, pci_isa_bridge_list, PCI_NO_CLASS );
136static struct device_driver sis_bridge_driver = {
137 .name =
"SIS ISA bridge",
139 .bus_driver_info = (
struct bus_driver_info * ) &sis_bridge_pci_driver,
152static void sis900_mdio_write(
int phy_id,
int location,
int val);
165 unsigned int t,
unsigned int s,
const char *p);
194 for (i = 0; i < 3; i++)
222 printf(
"Alternate function\n");
225 while(waittime < 2000) {
229 for (i = 0; i < 3; i++)
258 struct bus_loc bus_loc;
260 struct bus_dev bus_dev;
265 memset(&bus_loc, 0,
sizeof(bus_loc));
266 if ( ! find_by_driver ( &bus_loc, &
u.bus_dev, &sis_bridge_driver, 0 ) )
274 outb(0x09 + i, 0x70);
311 for (i = 0 ; i < 3 ; i++) {
377 printf (
"sis900_probe: Error MAC address not found\n");
391 for (phy_addr = 0; phy_addr < 32; phy_addr++) {
393 u16 phy_id0, phy_id1;
396 if (mii_status == 0xffff || mii_status == 0x0000)
409 printf(
"sis900_probe: %s transceiver found at address %d.\n",
413 mii.phy_addr = phy_addr;
424 printf(
"sis900_probe: No MII transceivers found!\n");
430 printf(
"sis900_probe: Using %s as default\n",
mii.chip_info->name);
449#define eeprom_delay() inl(ee_addr)
477 for (i = 8; i >= 0; i--) {
479 outl(dataval, ee_addr);
488 for (i = 16; i > 0; i--) {
505#define sis900_mdio_delay() inl(mdio_addr)
526 for (i = 31; i >= 0; i--) {
545 for (i = 15; i >= 0; i--) {
547 outl(dataval, mdio_addr);
549 outl(dataval |
MDC, mdio_addr);
554 for (i = 16; i > 0; i--) {
561 outl(0x00, mdio_addr);
566static void sis900_mdio_write(
int phy_id,
int location,
int value)
576 for (i = 15; i >= 0; i--) {
578 outb(dataval, mdio_addr);
580 outb(dataval |
MDC, mdio_addr);
586 for (i = 15; i >= 0; i--) {
588 outl(dataval, mdio_addr);
590 outl(dataval |
MDC, mdio_addr);
596 for (i = 2; i > 0; i--) {
602 outl(0x00, mdio_addr);
660 while (
status && (i++ < 1000)) {
692 for (i = 0 ; i < 3 ; i++) {
700 printf(
"sis900_init_rxfilter: Receive Filter Addrss[%d]=%X\n",
729 printf(
"sis900_init_txd: TX descriptor register loaded with: %X\n",
756 printf(
"sis900_init_rxd: rxd[%d]=%p link=%X cmdsts=%X bufptr=%X\n",
765 printf(
"sis900_init_rxd: RX descriptor register loaded with: %X\n",
784 int i, table_entries;
786 u16 mc_filter[16] = {0};
795 for (i = 0; i < table_entries; i++)
796 mc_filter[i] = 0xffff;
799 for (i = 0; i < table_entries; i++) {
827 u32 tx_flags = 0, rx_flags = 0;
874 u16 phy_id0, phy_id1;
892 if((phy_id0 == 0x0000) && ((phy_id1 & 0xFFF0) == 0x8200)){
900 printf(
"sis900_read_mode: Media Link Off\n");
902 printf(
"sis900_read_mode: Media Link On %s %s-duplex \n",
904 "100mbps" :
"10mbps",
926 for (i = 0; i < 2; i++)
931 for (i = 0; i < 2; i++)
943 printf(
"amd79c901_read_mode: Media Link On %s %s-duplex \n",
945 "100mbps" :
"10mbps",
949 printf(
"amd79c901_read_mode: Media Link Off\n");
956 printf(
"amd79c901_read_mode:Media Link On 1mbps half-duplex \n");
958 printf(
"amd79c901_read_mode: Media Link Off\n");
980 for (i = 0; i < 2; i++)
994 printf(
"ics1893_read_mode: Media Link On %s %s-duplex \n",
996 "100mbps" :
"10mbps",
1000 printf(
"ics1893_read_mode: Media Link Off\n");
1038 printf(
"rtl8201_read_mode: Media Link On %s %s-duplex \n",
1040 "100mbps" :
"10mbps",
1044 printf(
"rtl8201_read_config_mode: Media Link Off\n");
1082 printf(
"vt6103_read_mode: Media Link On %s %s-duplex \n",
1084 "100mbps" :
"10mbps",
1088 printf(
"vt6103_read_config_mode: Media Link Off\n");
1111 volatile u32 tx_status;
1119 printf(
"sis900_transmit: TX descriptor register loaded with: %X\n",
1132 printf(
"sis900_transmit: sending %d bytes ethtype %hX\n", (
int) s, t);
1146 printf(
"sis900_transmit: Queued Tx packet size %d.\n", (
int) s);
1154 printf(
"sis900_transmit: TX Timeout! Tx status %X.\n",
1155 (
unsigned int) tx_status);
1160 printf(
"sis900_transmit: Transmit error, Tx status %X.\n",
1161 (
unsigned int) tx_status);
1193 (
unsigned int) rx_status);
1195 if (!(rx_status &
OWN))
1199 printf(
"sis900_poll: got a packet: cur_rx:%d, status:%X\n",
1200 cur_rx, (
unsigned int) rx_status);
1202 if ( ! retrieve )
return 1;
1208 printf(
"sis900_poll: Corrupted packet received, buffer status = %X\n",
1209 (
unsigned int) rx_status);
1288PCI_ROM(0x1039, 0x0900,
"sis900",
"SIS900", 0),
1289PCI_ROM(0x1039, 0x7016,
"sis7016",
"SIS7016", 0),
#define NULL
NULL pointer (VOID *)
u8 signature
CPU signature.
u32 link
Link to next descriptor.
pseudo_bit_t value[0x00020]
static unsigned long ioaddr
static unsigned short vendor
static unsigned short dev_id
union @104331263140136355135267063077374276003064103115 u
static unsigned int cur_rx
#define __unused
Declare a variable or data structure as unused.
#define DBG(...)
Print a debugging message.
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
uint32_t revision
Entry point revision.
#define outb(data, io_addr)
#define outl(data, io_addr)
static __always_inline unsigned long virt_to_bus(volatile const void *addr)
Convert virtual address to a bus address.
int pci_write_config_byte(struct pci_device *pci, unsigned int where, uint8_t value)
Write byte to PCI configuration space.
int pci_read_config_byte(struct pci_device *pci, unsigned int where, uint8_t *value)
Read byte from PCI configuration space.
int pci_write_config_dword(struct pci_device *pci, unsigned int where, uint32_t value)
Write 32-bit dword to PCI configuration space.
void * memcpy(void *dest, const void *src, size_t len) __nonnull
void * memset(void *dest, int character, size_t len) __nonnull
int dummy_connect(struct nic *nic __unused)
static unsigned int unsigned int reg
uint32_t bufptr
Buffer pointer.
uint32_t cmdsts
Command / status.
#define DRIVER(_name_text, _unused2, _unused3, _name, _probe, _disable, _fake_bss)
#define PCI_DRIVER(_name, _ids, _class)
static struct command_descriptor read_cmd
"read" command descriptor
void adjust_pci_device(struct pci_device *pci)
Enable PCI device.
#define PCI_COMMAND_IO
I/O space.
#define PCI_COMMAND_MASTER
Bus master.
#define PCI_ROM(_vendor, _device, _name, _description, _data)
#define PCI_REVISION
PCI revision.
static struct mii_chip_info mii_chip_table[]
static void sis900_init_txd(struct nic *nic)
static void sis900_irq(struct nic *nic, irq_action_t action)
static int sis900_get_mac_addr(struct pci_device *pci_dev __unused, struct nic *nic)
sis900_get_mac_addr: - Get MAC address for stand alone SiS900 model @pci_dev: the sis900 pci device @...
static void sis900_check_mode(struct nic *nic)
static int sis630e_get_mac_addr(struct pci_device *pci_dev __unused, struct nic *nic __unused)
sis630e_get_mac_addr: - Get MAC address for SiS630E model @pci_dev: the sis900 pci device @net_dev: t...
static void sis900_set_rx_mode(struct nic *nic)
static int sis635_get_mac_addr(struct pci_device *pci_dev __unused, struct nic *nic)
sis630e_get_mac_addr: - Get MAC address for SiS630E model @pci_dev: the sis900 pci device @net_dev: t...
static struct mii_phy mii
static void sis900_disable(struct nic *nic, void *hwdev)
static u16 sis900_mdio_read(int phy_id, int location)
static void sis900_init_rxfilter(struct nic *nic)
static struct nic_operations sis900_operations
static void amd79c901_read_mode(struct nic *nic, int phy_addr, int *speed, int *duplex)
static u16 sis900_read_eeprom(int location)
static void ics1893_read_mode(struct nic *nic, int phy_addr, int *speed, int *duplex)
static void sis900_read_mode(struct nic *nic, int phy_addr, int *speed, int *duplex)
static void sis900_reset(struct nic *nic)
static void sis900_mdio_idle(long mdio_addr)
static void sis900_transmit(struct nic *nic, const char *d, unsigned int t, unsigned int s, const char *p)
static void sis900_init_rxd(struct nic *nic)
static void sis900_init(struct nic *nic)
static void rtl8201_read_mode(struct nic *nic, int phy_addr, int *speed, int *duplex)
static int sis900_poll(struct nic *nic, int retrieve)
static int sis96x_get_mac_addr(struct pci_device *pci_dev __unused, struct nic *nic)
sis96x_get_mac_addr: - Get MAC address for SiS962 or SiS963 model @pci_dev: the sis900 pci device @ne...
static void sis900_mdio_reset(long mdio_addr)
static unsigned int cur_phy
static int sis900_probe(struct nic *nic, struct pci_device *pci)
static void vt6103_read_mode(struct nic *nic, int phy_addr, int *speed, int *duplex)
static struct pci_device_id sis900_nics[]
#define sis900_mdio_delay()
#define FDX_CAPABLE_FULL_SELECTED
struct _BufferDesc BufferDesc
#define HW_SPEED_100_MBPS
#define SIS900_TOTAL_SIZE
#define FDX_CAPABLE_HALF_SELECTED
void(* read_mode)(struct nic *nic, int phy_addr, int *speed, int *duplex)
struct mii_chip_info * chip_info
unsigned char * node_addr
struct nic_operations * nic_op
A PCI device ID list entry.
unsigned long ioaddr
I/O address.
uint16_t vendor
Vendor ID.
uint16_t device
Device ID.
unsigned char rxb[NUM_RX_DESC *RX_BUF_SIZE]
BufferDesc rxd[NUM_RX_DESC]
unsigned char txb[TX_BUF_SIZE]
unsigned long currticks(void)
Get current system time in ticks.
void udelay(unsigned long usecs)
Delay for a fixed number of microseconds.
int printf(const char *fmt,...)
Write a formatted string to the console.