2 * Copyright(c) 2007 Atheros Corporation. All rights reserved.
4 * Derived from Intel e1000 driver
5 * Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the Free
9 * Software Foundation; either version 2 of the License, or (at your option)
12 * This program is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
17 * You should have received a copy of the GNU General Public License along with
18 * this program; if not, write to the Free Software Foundation, Inc., 59
19 * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 #include <linux/pci.h>
22 #include <linux/delay.h>
23 #include <linux/mii.h>
24 #include <linux/crc32.h>
30 * return 1 if eeprom exist
32 int atl1c_check_eeprom_exist(struct atl1c_hw
*hw
)
36 AT_READ_REG(hw
, REG_TWSI_DEBUG
, &data
);
37 if (data
& TWSI_DEBUG_DEV_EXIST
)
43 void atl1c_hw_set_mac_addr(struct atl1c_hw
*hw
)
51 value
= (((u32
)hw
->mac_addr
[2]) << 24) |
52 (((u32
)hw
->mac_addr
[3]) << 16) |
53 (((u32
)hw
->mac_addr
[4]) << 8) |
54 (((u32
)hw
->mac_addr
[5])) ;
55 AT_WRITE_REG_ARRAY(hw
, REG_MAC_STA_ADDR
, 0, value
);
57 value
= (((u32
)hw
->mac_addr
[0]) << 8) |
58 (((u32
)hw
->mac_addr
[1])) ;
59 AT_WRITE_REG_ARRAY(hw
, REG_MAC_STA_ADDR
, 1, value
);
63 * atl1c_get_permanent_address
64 * return 0 if get valid mac address,
66 static int atl1c_get_permanent_address(struct atl1c_hw
*hw
)
72 u8 eth_addr
[ETH_ALEN
];
75 addr
[0] = addr
[1] = 0;
76 AT_READ_REG(hw
, REG_OTP_CTRL
, &otp_ctrl_data
);
77 if (atl1c_check_eeprom_exist(hw
)) {
79 if (!(otp_ctrl_data
& OTP_CTRL_CLK_EN
)) {
80 otp_ctrl_data
|= OTP_CTRL_CLK_EN
;
81 AT_WRITE_REG(hw
, REG_OTP_CTRL
, otp_ctrl_data
);
86 AT_READ_REG(hw
, REG_TWSI_CTRL
, &twsi_ctrl_data
);
87 twsi_ctrl_data
|= TWSI_CTRL_SW_LDSTART
;
88 AT_WRITE_REG(hw
, REG_TWSI_CTRL
, twsi_ctrl_data
);
89 for (i
= 0; i
< AT_TWSI_EEPROM_TIMEOUT
; i
++) {
91 AT_READ_REG(hw
, REG_TWSI_CTRL
, &twsi_ctrl_data
);
92 if ((twsi_ctrl_data
& TWSI_CTRL_SW_LDSTART
) == 0)
95 if (i
>= AT_TWSI_EEPROM_TIMEOUT
)
99 if (otp_ctrl_data
& OTP_CTRL_CLK_EN
) {
100 otp_ctrl_data
&= ~OTP_CTRL_CLK_EN
;
101 AT_WRITE_REG(hw
, REG_OTP_CTRL
, otp_ctrl_data
);
106 /* maybe MAC-address is from BIOS */
107 AT_READ_REG(hw
, REG_MAC_STA_ADDR
, &addr
[0]);
108 AT_READ_REG(hw
, REG_MAC_STA_ADDR
+ 4, &addr
[1]);
109 *(u32
*) ð_addr
[2] = swab32(addr
[0]);
110 *(u16
*) ð_addr
[0] = swab16(*(u16
*)&addr
[1]);
112 if (is_valid_ether_addr(eth_addr
)) {
113 memcpy(hw
->perm_mac_addr
, eth_addr
, ETH_ALEN
);
120 bool atl1c_read_eeprom(struct atl1c_hw
*hw
, u32 offset
, u32
*p_value
)
129 return ret
; /* address do not align */
131 AT_READ_REG(hw
, REG_OTP_CTRL
, &otp_ctrl_data
);
132 if (!(otp_ctrl_data
& OTP_CTRL_CLK_EN
))
133 AT_WRITE_REG(hw
, REG_OTP_CTRL
,
134 (otp_ctrl_data
| OTP_CTRL_CLK_EN
));
136 AT_WRITE_REG(hw
, REG_EEPROM_DATA_LO
, 0);
137 control
= (offset
& EEPROM_CTRL_ADDR_MASK
) << EEPROM_CTRL_ADDR_SHIFT
;
138 AT_WRITE_REG(hw
, REG_EEPROM_CTRL
, control
);
140 for (i
= 0; i
< 10; i
++) {
142 AT_READ_REG(hw
, REG_EEPROM_CTRL
, &control
);
143 if (control
& EEPROM_CTRL_RW
)
146 if (control
& EEPROM_CTRL_RW
) {
147 AT_READ_REG(hw
, REG_EEPROM_CTRL
, &data
);
148 AT_READ_REG(hw
, REG_EEPROM_DATA_LO
, p_value
);
149 data
= data
& 0xFFFF;
150 *p_value
= swab32((data
<< 16) | (*p_value
>> 16));
153 if (!(otp_ctrl_data
& OTP_CTRL_CLK_EN
))
154 AT_WRITE_REG(hw
, REG_OTP_CTRL
, otp_ctrl_data
);
159 * Reads the adapter's MAC address from the EEPROM
161 * hw - Struct containing variables accessed by shared code
163 int atl1c_read_mac_addr(struct atl1c_hw
*hw
)
167 err
= atl1c_get_permanent_address(hw
);
169 random_ether_addr(hw
->perm_mac_addr
);
171 memcpy(hw
->mac_addr
, hw
->perm_mac_addr
, sizeof(hw
->perm_mac_addr
));
178 * set hash value for a multicast address
179 * hash calcu processing :
180 * 1. calcu 32bit CRC for multicast address
181 * 2. reverse crc with MSB to LSB
183 u32
atl1c_hash_mc_addr(struct atl1c_hw
*hw
, u8
*mc_addr
)
189 crc32
= ether_crc_le(6, mc_addr
);
190 for (i
= 0; i
< 32; i
++)
191 value
|= (((crc32
>> i
) & 1) << (31 - i
));
197 * Sets the bit in the multicast table corresponding to the hash value.
198 * hw - Struct containing variables accessed by shared code
199 * hash_value - Multicast address hash value
201 void atl1c_hash_set(struct atl1c_hw
*hw
, u32 hash_value
)
203 u32 hash_bit
, hash_reg
;
207 * The HASH Table is a register array of 2 32-bit registers.
208 * It is treated like an array of 64 bits. We want to set
209 * bit BitArray[hash_value]. So we figure out what register
210 * the bit is in, read it, OR in the new bit, then write
211 * back the new value. The register is determined by the
212 * upper bit of the hash value and the bit within that
213 * register are determined by the lower 5 bits of the value.
215 hash_reg
= (hash_value
>> 31) & 0x1;
216 hash_bit
= (hash_value
>> 26) & 0x1F;
218 mta
= AT_READ_REG_ARRAY(hw
, REG_RX_HASH_TABLE
, hash_reg
);
220 mta
|= (1 << hash_bit
);
222 AT_WRITE_REG_ARRAY(hw
, REG_RX_HASH_TABLE
, hash_reg
, mta
);
226 * Reads the value from a PHY register
227 * hw - Struct containing variables accessed by shared code
228 * reg_addr - address of the PHY register to read
230 int atl1c_read_phy_reg(struct atl1c_hw
*hw
, u16 reg_addr
, u16
*phy_data
)
235 val
= ((u32
)(reg_addr
& MDIO_REG_ADDR_MASK
)) << MDIO_REG_ADDR_SHIFT
|
236 MDIO_START
| MDIO_SUP_PREAMBLE
| MDIO_RW
|
237 MDIO_CLK_25_4
<< MDIO_CLK_SEL_SHIFT
;
239 AT_WRITE_REG(hw
, REG_MDIO_CTRL
, val
);
241 for (i
= 0; i
< MDIO_WAIT_TIMES
; i
++) {
243 AT_READ_REG(hw
, REG_MDIO_CTRL
, &val
);
244 if (!(val
& (MDIO_START
| MDIO_BUSY
)))
247 if (!(val
& (MDIO_START
| MDIO_BUSY
))) {
248 *phy_data
= (u16
)val
;
256 * Writes a value to a PHY register
257 * hw - Struct containing variables accessed by shared code
258 * reg_addr - address of the PHY register to write
259 * data - data to write to the PHY
261 int atl1c_write_phy_reg(struct atl1c_hw
*hw
, u32 reg_addr
, u16 phy_data
)
266 val
= ((u32
)(phy_data
& MDIO_DATA_MASK
)) << MDIO_DATA_SHIFT
|
267 (reg_addr
& MDIO_REG_ADDR_MASK
) << MDIO_REG_ADDR_SHIFT
|
268 MDIO_SUP_PREAMBLE
| MDIO_START
|
269 MDIO_CLK_25_4
<< MDIO_CLK_SEL_SHIFT
;
271 AT_WRITE_REG(hw
, REG_MDIO_CTRL
, val
);
273 for (i
= 0; i
< MDIO_WAIT_TIMES
; i
++) {
275 AT_READ_REG(hw
, REG_MDIO_CTRL
, &val
);
276 if (!(val
& (MDIO_START
| MDIO_BUSY
)))
280 if (!(val
& (MDIO_START
| MDIO_BUSY
)))
287 * Configures PHY autoneg and flow control advertisement settings
289 * hw - Struct containing variables accessed by shared code
291 static int atl1c_phy_setup_adv(struct atl1c_hw
*hw
)
293 u16 mii_adv_data
= ADVERTISE_DEFAULT_CAP
& ~ADVERTISE_SPEED_MASK
;
294 u16 mii_giga_ctrl_data
= GIGA_CR_1000T_DEFAULT_CAP
&
295 ~GIGA_CR_1000T_SPEED_MASK
;
297 if (hw
->autoneg_advertised
& ADVERTISED_10baseT_Half
)
298 mii_adv_data
|= ADVERTISE_10HALF
;
299 if (hw
->autoneg_advertised
& ADVERTISED_10baseT_Full
)
300 mii_adv_data
|= ADVERTISE_10FULL
;
301 if (hw
->autoneg_advertised
& ADVERTISED_100baseT_Half
)
302 mii_adv_data
|= ADVERTISE_100HALF
;
303 if (hw
->autoneg_advertised
& ADVERTISED_100baseT_Full
)
304 mii_adv_data
|= ADVERTISE_100FULL
;
306 if (hw
->autoneg_advertised
& ADVERTISED_Autoneg
)
307 mii_adv_data
|= ADVERTISE_10HALF
| ADVERTISE_10FULL
|
308 ADVERTISE_100HALF
| ADVERTISE_100FULL
;
310 if (hw
->ctrl_flags
& ATL1C_LINK_CAP_1000M
) {
311 if (hw
->autoneg_advertised
& ADVERTISED_1000baseT_Half
)
312 mii_giga_ctrl_data
|= ADVERTISE_1000HALF
;
313 if (hw
->autoneg_advertised
& ADVERTISED_1000baseT_Full
)
314 mii_giga_ctrl_data
|= ADVERTISE_1000FULL
;
315 if (hw
->autoneg_advertised
& ADVERTISED_Autoneg
)
316 mii_giga_ctrl_data
|= ADVERTISE_1000HALF
|
320 if (atl1c_write_phy_reg(hw
, MII_ADVERTISE
, mii_adv_data
) != 0 ||
321 atl1c_write_phy_reg(hw
, MII_GIGA_CR
, mii_giga_ctrl_data
) != 0)
326 void atl1c_phy_disable(struct atl1c_hw
*hw
)
328 AT_WRITE_REGW(hw
, REG_GPHY_CTRL
,
329 GPHY_CTRL_PW_WOL_DIS
| GPHY_CTRL_EXT_RESET
);
332 static void atl1c_phy_magic_data(struct atl1c_hw
*hw
)
336 data
= ANA_LOOP_SEL_10BT
| ANA_EN_MASK_TB
| ANA_EN_10BT_IDLE
|
337 ((1 & ANA_INTERVAL_SEL_TIMER_MASK
) <<
338 ANA_INTERVAL_SEL_TIMER_SHIFT
);
340 atl1c_write_phy_reg(hw
, MII_DBG_ADDR
, MII_ANA_CTRL_18
);
341 atl1c_write_phy_reg(hw
, MII_DBG_DATA
, data
);
343 data
= (2 & ANA_SERDES_CDR_BW_MASK
) | ANA_MS_PAD_DBG
|
344 ANA_SERDES_EN_DEEM
| ANA_SERDES_SEL_HSP
| ANA_SERDES_EN_PLL
|
347 atl1c_write_phy_reg(hw
, MII_DBG_ADDR
, MII_ANA_CTRL_5
);
348 atl1c_write_phy_reg(hw
, MII_DBG_DATA
, data
);
350 data
= (44 & ANA_LONG_CABLE_TH_100_MASK
) |
351 ((33 & ANA_SHORT_CABLE_TH_100_MASK
) <<
352 ANA_SHORT_CABLE_TH_100_SHIFT
) | ANA_BP_BAD_LINK_ACCUM
|
355 atl1c_write_phy_reg(hw
, MII_DBG_ADDR
, MII_ANA_CTRL_54
);
356 atl1c_write_phy_reg(hw
, MII_DBG_DATA
, data
);
358 data
= (11 & ANA_IECHO_ADJ_MASK
) | ((11 & ANA_IECHO_ADJ_MASK
) <<
359 ANA_IECHO_ADJ_2_SHIFT
) | ((8 & ANA_IECHO_ADJ_MASK
) <<
360 ANA_IECHO_ADJ_1_SHIFT
) | ((8 & ANA_IECHO_ADJ_MASK
) <<
361 ANA_IECHO_ADJ_0_SHIFT
);
363 atl1c_write_phy_reg(hw
, MII_DBG_ADDR
, MII_ANA_CTRL_4
);
364 atl1c_write_phy_reg(hw
, MII_DBG_DATA
, data
);
366 data
= ANA_RESTART_CAL
| ((7 & ANA_MANUL_SWICH_ON_MASK
) <<
367 ANA_MANUL_SWICH_ON_SHIFT
) | ANA_MAN_ENABLE
|
368 ANA_SEL_HSP
| ANA_EN_HB
| ANA_OEN_125M
;
370 atl1c_write_phy_reg(hw
, MII_DBG_ADDR
, MII_ANA_CTRL_0
);
371 atl1c_write_phy_reg(hw
, MII_DBG_DATA
, data
);
373 if (hw
->ctrl_flags
& ATL1C_HIB_DISABLE
) {
374 atl1c_write_phy_reg(hw
, MII_DBG_ADDR
, MII_ANA_CTRL_41
);
375 if (atl1c_read_phy_reg(hw
, MII_DBG_DATA
, &data
) != 0)
377 data
&= ~ANA_TOP_PS_EN
;
378 atl1c_write_phy_reg(hw
, MII_DBG_DATA
, data
);
380 atl1c_write_phy_reg(hw
, MII_DBG_ADDR
, MII_ANA_CTRL_11
);
381 if (atl1c_read_phy_reg(hw
, MII_DBG_DATA
, &data
) != 0)
383 data
&= ~ANA_PS_HIB_EN
;
384 atl1c_write_phy_reg(hw
, MII_DBG_DATA
, data
);
388 int atl1c_phy_reset(struct atl1c_hw
*hw
)
390 struct atl1c_adapter
*adapter
= hw
->adapter
;
391 struct pci_dev
*pdev
= adapter
->pdev
;
392 u32 phy_ctrl_data
= GPHY_CTRL_DEFAULT
;
393 u32 mii_ier_data
= IER_LINK_UP
| IER_LINK_DOWN
;
396 if (hw
->ctrl_flags
& ATL1C_HIB_DISABLE
)
397 phy_ctrl_data
&= ~GPHY_CTRL_HIB_EN
;
399 AT_WRITE_REG(hw
, REG_GPHY_CTRL
, phy_ctrl_data
);
402 phy_ctrl_data
|= GPHY_CTRL_EXT_RESET
;
403 AT_WRITE_REG(hw
, REG_GPHY_CTRL
, phy_ctrl_data
);
407 /*Enable PHY LinkChange Interrupt */
408 err
= atl1c_write_phy_reg(hw
, MII_IER
, mii_ier_data
);
410 if (netif_msg_hw(adapter
))
412 "Error enable PHY linkChange Interrupt\n");
415 if (!(hw
->ctrl_flags
& ATL1C_FPGA_VERSION
))
416 atl1c_phy_magic_data(hw
);
420 int atl1c_phy_init(struct atl1c_hw
*hw
)
422 struct atl1c_adapter
*adapter
= (struct atl1c_adapter
*)hw
->adapter
;
423 struct pci_dev
*pdev
= adapter
->pdev
;
425 u16 mii_bmcr_data
= BMCR_RESET
;
426 u16 phy_id1
, phy_id2
;
428 if ((atl1c_read_phy_reg(hw
, MII_PHYSID1
, &phy_id1
) != 0) ||
429 (atl1c_read_phy_reg(hw
, MII_PHYSID2
, &phy_id2
) != 0)) {
430 if (netif_msg_link(adapter
))
431 dev_err(&pdev
->dev
, "Error get phy ID\n");
434 switch (hw
->media_type
) {
435 case MEDIA_TYPE_AUTO_SENSOR
:
436 ret_val
= atl1c_phy_setup_adv(hw
);
438 if (netif_msg_link(adapter
))
440 "Error Setting up Auto-Negotiation\n");
443 mii_bmcr_data
|= BMCR_AUTO_NEG_EN
| BMCR_RESTART_AUTO_NEG
;
445 case MEDIA_TYPE_100M_FULL
:
446 mii_bmcr_data
|= BMCR_SPEED_100
| BMCR_FULL_DUPLEX
;
448 case MEDIA_TYPE_100M_HALF
:
449 mii_bmcr_data
|= BMCR_SPEED_100
;
451 case MEDIA_TYPE_10M_FULL
:
452 mii_bmcr_data
|= BMCR_SPEED_10
| BMCR_FULL_DUPLEX
;
454 case MEDIA_TYPE_10M_HALF
:
455 mii_bmcr_data
|= BMCR_SPEED_10
;
458 if (netif_msg_link(adapter
))
459 dev_err(&pdev
->dev
, "Wrong Media type %d\n",
465 ret_val
= atl1c_write_phy_reg(hw
, MII_BMCR
, mii_bmcr_data
);
468 hw
->phy_configured
= true;
474 * Detects the current speed and duplex settings of the hardware.
476 * hw - Struct containing variables accessed by shared code
477 * speed - Speed of the connection
478 * duplex - Duplex setting of the connection
480 int atl1c_get_speed_and_duplex(struct atl1c_hw
*hw
, u16
*speed
, u16
*duplex
)
485 /* Read PHY Specific Status Register (17) */
486 err
= atl1c_read_phy_reg(hw
, MII_GIGA_PSSR
, &phy_data
);
490 if (!(phy_data
& GIGA_PSSR_SPD_DPLX_RESOLVED
))
493 switch (phy_data
& GIGA_PSSR_SPEED
) {
494 case GIGA_PSSR_1000MBS
:
497 case GIGA_PSSR_100MBS
:
500 case GIGA_PSSR_10MBS
:
508 if (phy_data
& GIGA_PSSR_DPLX
)
509 *duplex
= FULL_DUPLEX
;
511 *duplex
= HALF_DUPLEX
;
516 int atl1c_restart_autoneg(struct atl1c_hw
*hw
)
519 u16 mii_bmcr_data
= BMCR_RESET
;
521 err
= atl1c_phy_setup_adv(hw
);
524 mii_bmcr_data
|= BMCR_AUTO_NEG_EN
| BMCR_RESTART_AUTO_NEG
;
526 return atl1c_write_phy_reg(hw
, MII_BMCR
, mii_bmcr_data
);