Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 1 | /* |
Stefan Reinauer | 7e61e45 | 2008-01-18 10:35:56 +0000 | [diff] [blame] | 2 | * This file is part of the coreboot project. |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 3 | * |
| 4 | * Copyright (C) 2004 Tyan Computer |
| 5 | * Written by Yinghai Lu <yhlu@tyan.com> for Tyan Computer. |
| 6 | * Copyright (C) 2006,2007 AMD |
| 7 | * Written by Yinghai Lu <yinghai.lu@amd.com> for AMD. |
| 8 | * Copyright (C) 2007 Silicon Integrated Systems Corp. (SiS) |
| 9 | * Written by Morgan Tsai <my_tsai@sis.com> for SiS. |
| 10 | * |
| 11 | * This program is free software; you can redistribute it and/or modify |
| 12 | * it under the terms of the GNU General Public License as published by |
| 13 | * the Free Software Foundation; either version 2 of the License, or |
| 14 | * (at your option) any later version. |
| 15 | * |
| 16 | * This program is distributed in the hope that it will be useful, |
| 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 19 | * GNU General Public License for more details. |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 20 | */ |
| 21 | |
| 22 | #include <console/console.h> |
| 23 | #include <device/device.h> |
| 24 | #include <device/smbus.h> |
| 25 | #include <device/pci.h> |
| 26 | #include <device/pci_ids.h> |
| 27 | #include <device/pci_ops.h> |
| 28 | #include <arch/io.h> |
| 29 | #include <delay.h> |
| 30 | #include "sis966.h" |
| 31 | |
| 32 | |
Stefan Reinauer | eea66b7 | 2010-04-07 15:32:52 +0000 | [diff] [blame] | 33 | u8 SiS_SiS191_init[6][3]={ |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 34 | {0x04, 0xFF, 0x07}, |
| 35 | {0x2C, 0xFF, 0x39}, |
| 36 | {0x2D, 0xFF, 0x10}, |
| 37 | {0x2E, 0xFF, 0x91}, |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 38 | {0x2F, 0xFF, 0x01}, |
| 39 | {0x00, 0x00, 0x00} //End of table |
| 40 | }; |
| 41 | |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 42 | |
| 43 | #define StatusReg 0x1 |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 44 | #define SMI_READ 0x0 |
| 45 | #define SMI_REQUEST 0x10 |
| 46 | #define TRUE 1 |
| 47 | #define FALSE 0 |
| 48 | |
Stefan Reinauer | eea66b7 | 2010-04-07 15:32:52 +0000 | [diff] [blame] | 49 | u16 MacAddr[3]; |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 50 | |
| 51 | |
Stefan Reinauer | eea66b7 | 2010-04-07 15:32:52 +0000 | [diff] [blame] | 52 | static void writeApcByte(int addr, u8 value) |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 53 | { |
| 54 | outb(addr,0x78); |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 55 | outb(value,0x79); |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 56 | } |
Stefan Reinauer | eea66b7 | 2010-04-07 15:32:52 +0000 | [diff] [blame] | 57 | |
| 58 | static u8 readApcByte(int addr) |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 59 | { |
Stefan Reinauer | eea66b7 | 2010-04-07 15:32:52 +0000 | [diff] [blame] | 60 | u8 value; |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 61 | outb(addr,0x78); |
| 62 | value=inb(0x79); |
| 63 | return(value); |
| 64 | } |
| 65 | |
| 66 | static void readApcMacAddr(void) |
| 67 | { |
Stefan Reinauer | eea66b7 | 2010-04-07 15:32:52 +0000 | [diff] [blame] | 68 | u8 i; |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 69 | |
| 70 | // enable APC in south bridge sis966 D2F0 |
| 71 | |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 72 | outl(0x80001048,0xcf8); |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 73 | outl((inl(0xcfc) & 0xfffffffd),0xcfc ); // enable IO78/79h for APC Index/Data |
| 74 | |
Stefan Reinauer | c02b4fc | 2010-03-22 11:42:32 +0000 | [diff] [blame] | 75 | printk(BIOS_DEBUG, "MAC addr in APC = "); |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 76 | for(i = 0x9 ; i <=0xe ; i++) |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 77 | { |
Stefan Reinauer | c02b4fc | 2010-03-22 11:42:32 +0000 | [diff] [blame] | 78 | printk(BIOS_DEBUG, "%2.2x",readApcByte(i)); |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 79 | } |
Stefan Reinauer | c02b4fc | 2010-03-22 11:42:32 +0000 | [diff] [blame] | 80 | printk(BIOS_DEBUG, "\n"); |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 81 | |
| 82 | /* Set APC Reload */ |
| 83 | writeApcByte(0x7,readApcByte(0x7)&0xf7); |
| 84 | writeApcByte(0x7,readApcByte(0x7)|0x0a); |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 85 | |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 86 | /* disable APC in south bridge */ |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 87 | outl(0x80001048,0xcf8); |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 88 | outl(inl(0xcfc)&0xffffffbf,0xcfc); |
| 89 | } |
| 90 | |
| 91 | static void set_apc(struct device *dev) |
| 92 | { |
Stefan Reinauer | eea66b7 | 2010-04-07 15:32:52 +0000 | [diff] [blame] | 93 | u16 addr; |
| 94 | u16 i; |
| 95 | u8 bTmp; |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 96 | |
| 97 | /* enable APC in south bridge sis966 D2F0 */ |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 98 | outl(0x80001048,0xcf8); |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 99 | outl((inl(0xcfc) & 0xfffffffd),0xcfc ); // enable IO78/79h for APC Index/Data |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 100 | |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 101 | for(i = 0 ; i <3; i++) |
| 102 | { |
| 103 | addr=0x9+2*i; |
Stefan Reinauer | eea66b7 | 2010-04-07 15:32:52 +0000 | [diff] [blame] | 104 | writeApcByte(addr,(u8)(MacAddr[i]&0xFF)); |
| 105 | writeApcByte(addr+1L,(u8)((MacAddr[i]>>8)&0xFF)); |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 106 | // printf("%x - ",readMacAddrByte(0x59+i)); |
| 107 | } |
| 108 | |
| 109 | /* Set APC Reload */ |
| 110 | writeApcByte(0x7,readApcByte(0x7)&0xf7); |
| 111 | writeApcByte(0x7,readApcByte(0x7)|0x0a); |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 112 | |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 113 | /* disable APC in south bridge */ |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 114 | outl(0x80001048,0xcf8); |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 115 | outl(inl(0xcfc)&0xffffffbf,0xcfc); |
| 116 | |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 117 | // CFG reg0x73 bit=1, tell driver MAC Address load to APC |
| 118 | bTmp = pci_read_config8(dev, 0x73); |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 119 | bTmp|=0x1; |
| 120 | pci_write_config8(dev, 0x73, bTmp); |
| 121 | } |
| 122 | |
Uwe Hermann | b69cb5a | 2010-10-26 22:46:43 +0000 | [diff] [blame] | 123 | /** |
| 124 | * Read one word out of the serial EEPROM. |
| 125 | * |
| 126 | * @param dev TODO |
| 127 | * @param base TODO |
| 128 | * @param Reg EEPROM word to read. |
| 129 | * @return Contents of EEPROM word (Reg). |
| 130 | */ |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 131 | #define LoopNum 200 |
Kevin Paul Herbert | bde6d30 | 2014-12-24 18:43:20 -0800 | [diff] [blame] | 132 | static unsigned long ReadEEprom( struct device *dev, u8 *base, u32 Reg) |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 133 | { |
Stefan Reinauer | eea66b7 | 2010-04-07 15:32:52 +0000 | [diff] [blame] | 134 | u32 data; |
| 135 | u32 i; |
| 136 | u32 ulValue; |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 137 | |
| 138 | |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 139 | ulValue = (0x80 | (0x2 << 8) | (Reg << 10)); //BIT_7 |
| 140 | |
Kevin Paul Herbert | bde6d30 | 2014-12-24 18:43:20 -0800 | [diff] [blame] | 141 | write32(base + 0x3c, ulValue); |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 142 | |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 143 | mdelay(10); |
| 144 | |
| 145 | for(i=0 ; i <= LoopNum; i++) |
| 146 | { |
Kevin Paul Herbert | bde6d30 | 2014-12-24 18:43:20 -0800 | [diff] [blame] | 147 | ulValue=read32(base + 0x3c); |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 148 | |
| 149 | if(!(ulValue & 0x0080)) //BIT_7 |
| 150 | break; |
| 151 | |
| 152 | mdelay(100); |
| 153 | } |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 154 | |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 155 | mdelay(50); |
| 156 | |
| 157 | if(i==LoopNum) data=0x10000; |
| 158 | else{ |
Kevin Paul Herbert | bde6d30 | 2014-12-24 18:43:20 -0800 | [diff] [blame] | 159 | ulValue=read32(base + 0x3c); |
Carl-Daniel Hailfinger | a358892 | 2007-11-05 22:21:27 +0000 | [diff] [blame] | 160 | data = ((ulValue & 0xffff0000) >> 16); |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 161 | } |
| 162 | |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 163 | return data; |
| 164 | } |
| 165 | |
Kevin Paul Herbert | bde6d30 | 2014-12-24 18:43:20 -0800 | [diff] [blame] | 166 | static int phy_read(u8 *base, unsigned phy_addr, unsigned phy_reg) |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 167 | { |
Stefan Reinauer | eea66b7 | 2010-04-07 15:32:52 +0000 | [diff] [blame] | 168 | u32 ulValue; |
| 169 | u32 Read_Cmd; |
| 170 | u16 usData; |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 171 | |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 172 | |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 173 | |
| 174 | Read_Cmd = ((phy_reg << 11) | |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 175 | (phy_addr << 6) | |
| 176 | SMI_READ | |
| 177 | SMI_REQUEST); |
| 178 | |
| 179 | // SmiMgtInterface Reg is the SMI management interface register(offset 44h) of MAC |
Kevin Paul Herbert | bde6d30 | 2014-12-24 18:43:20 -0800 | [diff] [blame] | 180 | write32(base + 0x44, Read_Cmd); |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 181 | |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 182 | // Polling SMI_REQ bit to be deasserted indicated read command completed |
| 183 | do |
| 184 | { |
| 185 | // Wait 20 usec before checking status |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 186 | mdelay(20); |
Kevin Paul Herbert | bde6d30 | 2014-12-24 18:43:20 -0800 | [diff] [blame] | 187 | ulValue = read32(base + 0x44); |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 188 | } while((ulValue & SMI_REQUEST) != 0); |
Stefan Reinauer | c02b4fc | 2010-03-22 11:42:32 +0000 | [diff] [blame] | 189 | //printk(BIOS_DEBUG, "base %x cmd %lx ret val %lx\n", tmp,Read_Cmd,ulValue); |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 190 | usData=(ulValue>>16); |
| 191 | |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 192 | |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 193 | |
| 194 | return usData; |
| 195 | |
| 196 | } |
| 197 | |
| 198 | // Detect a valid PHY |
| 199 | // If there exist a valid PHY then return TRUE, else return FALSE |
Kevin Paul Herbert | bde6d30 | 2014-12-24 18:43:20 -0800 | [diff] [blame] | 200 | static int phy_detect(u8 *base,u16 *PhyAddr) //BOOL PHY_Detect() |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 201 | { |
| 202 | int bFoundPhy = FALSE; |
Stefan Reinauer | eea66b7 | 2010-04-07 15:32:52 +0000 | [diff] [blame] | 203 | u16 usData; |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 204 | int PhyAddress = 0; |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 205 | |
| 206 | |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 207 | // Scan all PHY address(0 ~ 31) to find a valid PHY |
| 208 | for(PhyAddress = 0; PhyAddress < 32; PhyAddress++) |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 209 | { |
| 210 | usData=phy_read(base,PhyAddress,StatusReg); // Status register is a PHY's register(offset 01h) |
| 211 | |
| 212 | // Found a valid PHY |
| 213 | |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 214 | if((usData != 0x0) && (usData != 0xffff)) |
| 215 | { |
| 216 | bFoundPhy = TRUE; |
| 217 | break; |
| 218 | } |
| 219 | } |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 220 | |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 221 | |
| 222 | if(!bFoundPhy) |
| 223 | { |
Stefan Reinauer | c02b4fc | 2010-03-22 11:42:32 +0000 | [diff] [blame] | 224 | printk(BIOS_DEBUG, "PHY not found !!!! \n"); |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 225 | } |
| 226 | |
| 227 | *PhyAddr=PhyAddress; |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 228 | |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 229 | return bFoundPhy; |
| 230 | } |
| 231 | |
| 232 | |
| 233 | static void nic_init(struct device *dev) |
| 234 | { |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 235 | int val; |
Stefan Reinauer | eea66b7 | 2010-04-07 15:32:52 +0000 | [diff] [blame] | 236 | u16 PhyAddr; |
Kevin Paul Herbert | bde6d30 | 2014-12-24 18:43:20 -0800 | [diff] [blame] | 237 | u8 *base; |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 238 | struct resource *res; |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 239 | |
Stefan Reinauer | 5ab52dd | 2015-01-05 13:01:01 -0800 | [diff] [blame] | 240 | printk(BIOS_DEBUG, "NIC_INIT:---------->\n"); |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 241 | |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 242 | //-------------- enable NIC (SiS19x) ------------------------- |
| 243 | { |
Stefan Reinauer | eea66b7 | 2010-04-07 15:32:52 +0000 | [diff] [blame] | 244 | u8 temp8; |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 245 | int i=0; |
| 246 | while(SiS_SiS191_init[i][0] != 0) |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 247 | { |
| 248 | temp8 = pci_read_config8(dev, SiS_SiS191_init[i][0]); |
| 249 | temp8 &= SiS_SiS191_init[i][1]; |
| 250 | temp8 |= SiS_SiS191_init[i][2]; |
| 251 | pci_write_config8(dev, SiS_SiS191_init[i][0], temp8); |
| 252 | i++; |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 253 | }; |
| 254 | } |
| 255 | //----------------------------------------------------------- |
| 256 | |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 257 | { |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 258 | unsigned long i; |
| 259 | unsigned long ulValue; |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 260 | |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 261 | res = find_resource(dev, 0x10); |
| 262 | |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 263 | if(!res) |
| 264 | { |
Stefan Reinauer | 64ed2b7 | 2010-03-31 14:47:43 +0000 | [diff] [blame] | 265 | printk(BIOS_DEBUG, "NIC Cannot find resource..\n"); |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 266 | return; |
| 267 | } |
Kevin Paul Herbert | bde6d30 | 2014-12-24 18:43:20 -0800 | [diff] [blame] | 268 | base = res2mmio(res, 0, 0); |
| 269 | printk(BIOS_DEBUG, "NIC base address %p\n",base); |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 270 | |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 271 | if(!(val=phy_detect(base,&PhyAddr))) |
| 272 | { |
Stefan Reinauer | 64ed2b7 | 2010-03-31 14:47:43 +0000 | [diff] [blame] | 273 | printk(BIOS_DEBUG, "PHY detect fail !!!!\n"); |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 274 | return; |
| 275 | } |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 276 | |
Stefan Reinauer | 9fe4d79 | 2010-01-16 17:53:38 +0000 | [diff] [blame] | 277 | ulValue=read32(base + 0x38L); // check EEPROM existing |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 278 | |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 279 | if((ulValue & 0x0002)) |
| 280 | { |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 281 | |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 282 | // read MAC address from EEPROM at first |
| 283 | |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 284 | // if that is valid we will use that |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 285 | |
Myles Watson | 08e0fb8 | 2010-03-22 16:33:25 +0000 | [diff] [blame] | 286 | printk(BIOS_DEBUG, "EEPROM contents %lx \n",ReadEEprom( dev, base, 0LL)); |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 287 | for(i=0;i<3;i++) { |
| 288 | //status = smbus_read_byte(dev_eeprom, i); |
| 289 | ulValue=ReadEEprom( dev, base, i+3L); |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 290 | if (ulValue ==0x10000) break; // error |
| 291 | |
| 292 | MacAddr[i] =ulValue & 0xFFFF; |
| 293 | |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 294 | } |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 295 | }else{ |
| 296 | // read MAC address from firmware |
Stefan Reinauer | c02b4fc | 2010-03-22 11:42:32 +0000 | [diff] [blame] | 297 | printk(BIOS_DEBUG, "EEPROM invalid!!\nReg 0x38h=%.8lx \n",ulValue); |
Kevin Paul Herbert | bde6d30 | 2014-12-24 18:43:20 -0800 | [diff] [blame] | 298 | MacAddr[0]=read16((u16 *)0xffffffc0); // mac address store at here |
| 299 | MacAddr[1]=read16((u16 *)0xffffffc2); |
| 300 | MacAddr[2]=read16((u16 *)0xffffffc4); |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 301 | } |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 302 | |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 303 | set_apc(dev); |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 304 | |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 305 | readApcMacAddr(); |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 306 | |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 307 | #if DEBUG_NIC |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 308 | { |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 309 | int i; |
| 310 | |
Stefan Reinauer | 5ab52dd | 2015-01-05 13:01:01 -0800 | [diff] [blame] | 311 | printk(BIOS_DEBUG, "****** NIC PCI config ******"); |
| 312 | printk(BIOS_DEBUG, "\n 03020100 07060504 0B0A0908 0F0E0D0C"); |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 313 | |
| 314 | for(i=0;i<0xff;i+=4){ |
Stefan Reinauer | 5ab52dd | 2015-01-05 13:01:01 -0800 | [diff] [blame] | 315 | if((i%16)==0) |
| 316 | printk(BIOS_DEBUG, "\n%02x: ", i); |
| 317 | printk(BIOS_DEBUG, "%08x ", pci_read_config32(dev,i)); |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 318 | } |
Stefan Reinauer | 5ab52dd | 2015-01-05 13:01:01 -0800 | [diff] [blame] | 319 | printk(BIOS_DEBUG, "\n"); |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 320 | } |
| 321 | |
Morgan Tsai | 218c265 | 2007-11-02 16:09:58 +0000 | [diff] [blame] | 322 | |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 323 | #endif |
| 324 | |
| 325 | } |
| 326 | |
Stefan Reinauer | 5ab52dd | 2015-01-05 13:01:01 -0800 | [diff] [blame] | 327 | printk(BIOS_DEBUG, "NIC_INIT:<----------\n"); |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 328 | return; |
| 329 | |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 330 | |
| 331 | } |
| 332 | |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 333 | static void lpci_set_subsystem(device_t dev, unsigned vendor, unsigned device) |
| 334 | { |
| 335 | pci_write_config32(dev, 0x40, |
| 336 | ((device & 0xffff) << 16) | (vendor & 0xffff)); |
| 337 | } |
| 338 | |
| 339 | static struct pci_operations lops_pci = { |
| 340 | .set_subsystem = lpci_set_subsystem, |
| 341 | }; |
| 342 | |
| 343 | static struct device_operations nic_ops = { |
| 344 | .read_resources = pci_dev_read_resources, |
| 345 | .set_resources = pci_dev_set_resources, |
| 346 | .enable_resources = pci_dev_enable_resources, |
| 347 | .init = nic_init, |
| 348 | .scan_bus = 0, |
| 349 | // .enable = sis966_enable, |
| 350 | .ops_pci = &lops_pci, |
| 351 | }; |
Carl-Daniel Hailfinger | a358892 | 2007-11-05 22:21:27 +0000 | [diff] [blame] | 352 | |
Stefan Reinauer | 83b52e7 | 2007-10-30 02:17:49 +0000 | [diff] [blame] | 353 | static const struct pci_driver nic_driver __pci_driver = { |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 354 | .ops = &nic_ops, |
| 355 | .vendor = PCI_VENDOR_ID_SIS, |
Morgan Tsai | 31e805d | 2007-11-14 01:34:02 +0000 | [diff] [blame] | 356 | .device = PCI_DEVICE_ID_SIS_SIS966_NIC, |
Morgan Tsai | 1602dd5 | 2007-10-29 21:00:14 +0000 | [diff] [blame] | 357 | }; |