|
|
1.1 ! root 1: /************************************************************************** ! 2: * ! 3: * Etherboot driver for Level 5 Etherfabric network cards ! 4: * ! 5: * Written by Michael Brown <[email protected]> ! 6: * ! 7: * Copyright Fen Systems Ltd. 2005 ! 8: * Copyright Level 5 Networks Inc. 2005 ! 9: * ! 10: * This software may be used and distributed according to the terms of ! 11: * the GNU General Public License (GPL), incorporated herein by ! 12: * reference. Drivers based on or derived from this code fall under ! 13: * the GPL and must retain the authorship, copyright and license ! 14: * notice. ! 15: * ! 16: ************************************************************************** ! 17: */ ! 18: ! 19: FILE_LICENCE ( GPL_ANY ); ! 20: ! 21: #include <stdint.h> ! 22: #include <stdlib.h> ! 23: #include <unistd.h> ! 24: #include <errno.h> ! 25: #include <assert.h> ! 26: #include <byteswap.h> ! 27: #include <ipxe/console.h> ! 28: #include <ipxe/io.h> ! 29: #include <ipxe/pci.h> ! 30: #include <ipxe/malloc.h> ! 31: #include <ipxe/ethernet.h> ! 32: #include <ipxe/iobuf.h> ! 33: #include <ipxe/netdevice.h> ! 34: #include <ipxe/timer.h> ! 35: #include <mii.h> ! 36: #include "etherfabric.h" ! 37: #include "etherfabric_nic.h" ! 38: ! 39: /************************************************************************** ! 40: * ! 41: * Constants and macros ! 42: * ! 43: ************************************************************************** ! 44: */ ! 45: ! 46: #define EFAB_REGDUMP(...) ! 47: #define EFAB_TRACE(...) DBGP(__VA_ARGS__) ! 48: ! 49: // printf() is not allowed within drivers. Use DBG() instead. ! 50: #define EFAB_LOG(...) DBG(__VA_ARGS__) ! 51: #define EFAB_ERR(...) DBG(__VA_ARGS__) ! 52: ! 53: #define FALCON_USE_IO_BAR 0 ! 54: ! 55: #define HZ 100 ! 56: #define EFAB_BYTE 1 ! 57: ! 58: /************************************************************************** ! 59: * ! 60: * Hardware data structures and sizing ! 61: * ! 62: ************************************************************************** ! 63: */ ! 64: extern int __invalid_queue_size; ! 65: #define FQS(_prefix, _x) \ ! 66: ( ( (_x) == 512 ) ? _prefix ## _SIZE_512 : \ ! 67: ( ( (_x) == 1024 ) ? _prefix ## _SIZE_1K : \ ! 68: ( ( (_x) == 2048 ) ? _prefix ## _SIZE_2K : \ ! 69: ( ( (_x) == 4096) ? _prefix ## _SIZE_4K : \ ! 70: __invalid_queue_size ) ) ) ) ! 71: ! 72: ! 73: #define EFAB_MAX_FRAME_LEN(mtu) \ ! 74: ( ( ( ( mtu ) + 4/* FCS */ ) + 7 ) & ~7 ) ! 75: ! 76: /************************************************************************** ! 77: * ! 78: * GMII routines ! 79: * ! 80: ************************************************************************** ! 81: */ ! 82: ! 83: static void falcon_mdio_write (struct efab_nic *efab, int device, ! 84: int location, int value ); ! 85: static int falcon_mdio_read ( struct efab_nic *efab, int device, int location ); ! 86: ! 87: /* GMII registers */ ! 88: #define GMII_PSSR 0x11 /* PHY-specific status register */ ! 89: ! 90: /* Pseudo extensions to the link partner ability register */ ! 91: #define LPA_EF_1000FULL 0x00020000 ! 92: #define LPA_EF_1000HALF 0x00010000 ! 93: #define LPA_EF_10000FULL 0x00040000 ! 94: #define LPA_EF_10000HALF 0x00080000 ! 95: ! 96: #define LPA_100 (LPA_100FULL | LPA_100HALF | LPA_100BASE4) ! 97: #define LPA_EF_1000 ( LPA_EF_1000FULL | LPA_EF_1000HALF ) ! 98: #define LPA_EF_10000 ( LPA_EF_10000FULL | LPA_EF_10000HALF ) ! 99: #define LPA_EF_DUPLEX ( LPA_10FULL | LPA_100FULL | LPA_EF_1000FULL | \ ! 100: LPA_EF_10000FULL ) ! 101: ! 102: /* Mask of bits not associated with speed or duplexity. */ ! 103: #define LPA_OTHER ~( LPA_10FULL | LPA_10HALF | LPA_100FULL | \ ! 104: LPA_100HALF | LPA_EF_1000FULL | LPA_EF_1000HALF ) ! 105: ! 106: /* PHY-specific status register */ ! 107: #define PSSR_LSTATUS 0x0400 /* Bit 10 - link status */ ! 108: ! 109: /** ! 110: * Retrieve GMII autonegotiation advertised abilities ! 111: * ! 112: */ ! 113: static unsigned int ! 114: gmii_autoneg_advertised ( struct efab_nic *efab ) ! 115: { ! 116: unsigned int mii_advertise; ! 117: unsigned int gmii_advertise; ! 118: ! 119: /* Extended bits are in bits 8 and 9 of MII_CTRL1000 */ ! 120: mii_advertise = falcon_mdio_read ( efab, 0, MII_ADVERTISE ); ! 121: gmii_advertise = ( ( falcon_mdio_read ( efab, 0, MII_CTRL1000 ) >> 8 ) ! 122: & 0x03 ); ! 123: return ( ( gmii_advertise << 16 ) | mii_advertise ); ! 124: } ! 125: ! 126: /** ! 127: * Retrieve GMII autonegotiation link partner abilities ! 128: * ! 129: */ ! 130: static unsigned int ! 131: gmii_autoneg_lpa ( struct efab_nic *efab ) ! 132: { ! 133: unsigned int mii_lpa; ! 134: unsigned int gmii_lpa; ! 135: ! 136: /* Extended bits are in bits 10 and 11 of MII_STAT1000 */ ! 137: mii_lpa = falcon_mdio_read ( efab, 0, MII_LPA ); ! 138: gmii_lpa = ( falcon_mdio_read ( efab, 0, MII_STAT1000 ) >> 10 ) & 0x03; ! 139: return ( ( gmii_lpa << 16 ) | mii_lpa ); ! 140: } ! 141: ! 142: /** ! 143: * Calculate GMII autonegotiated link technology ! 144: * ! 145: */ ! 146: static unsigned int ! 147: gmii_nway_result ( unsigned int negotiated ) ! 148: { ! 149: unsigned int other_bits; ! 150: ! 151: /* Mask out the speed and duplexity bits */ ! 152: other_bits = negotiated & LPA_OTHER; ! 153: ! 154: if ( negotiated & LPA_EF_1000FULL ) ! 155: return ( other_bits | LPA_EF_1000FULL ); ! 156: else if ( negotiated & LPA_EF_1000HALF ) ! 157: return ( other_bits | LPA_EF_1000HALF ); ! 158: else if ( negotiated & LPA_100FULL ) ! 159: return ( other_bits | LPA_100FULL ); ! 160: else if ( negotiated & LPA_100BASE4 ) ! 161: return ( other_bits | LPA_100BASE4 ); ! 162: else if ( negotiated & LPA_100HALF ) ! 163: return ( other_bits | LPA_100HALF ); ! 164: else if ( negotiated & LPA_10FULL ) ! 165: return ( other_bits | LPA_10FULL ); ! 166: else return ( other_bits | LPA_10HALF ); ! 167: } ! 168: ! 169: /** ! 170: * Check GMII PHY link status ! 171: * ! 172: */ ! 173: static int ! 174: gmii_link_ok ( struct efab_nic *efab ) ! 175: { ! 176: int status; ! 177: int phy_status; ! 178: ! 179: /* BMSR is latching - it returns "link down" if the link has ! 180: * been down at any point since the last read. To get a ! 181: * real-time status, we therefore read the register twice and ! 182: * use the result of the second read. ! 183: */ ! 184: (void) falcon_mdio_read ( efab, 0, MII_BMSR ); ! 185: status = falcon_mdio_read ( efab, 0, MII_BMSR ); ! 186: ! 187: /* Read the PHY-specific Status Register. This is ! 188: * non-latching, so we need do only a single read. ! 189: */ ! 190: phy_status = falcon_mdio_read ( efab, 0, GMII_PSSR ); ! 191: ! 192: return ( ( status & BMSR_LSTATUS ) && ( phy_status & PSSR_LSTATUS ) ); ! 193: } ! 194: ! 195: /************************************************************************** ! 196: * ! 197: * MDIO routines ! 198: * ! 199: ************************************************************************** ! 200: */ ! 201: ! 202: /* Numbering of the MDIO Manageable Devices (MMDs) */ ! 203: /* Physical Medium Attachment/ Physical Medium Dependent sublayer */ ! 204: #define MDIO_MMD_PMAPMD (1) ! 205: /* WAN Interface Sublayer */ ! 206: #define MDIO_MMD_WIS (2) ! 207: /* Physical Coding Sublayer */ ! 208: #define MDIO_MMD_PCS (3) ! 209: /* PHY Extender Sublayer */ ! 210: #define MDIO_MMD_PHYXS (4) ! 211: /* Extender Sublayer */ ! 212: #define MDIO_MMD_DTEXS (5) ! 213: /* Transmission convergence */ ! 214: #define MDIO_MMD_TC (6) ! 215: /* Auto negotiation */ ! 216: #define MDIO_MMD_AN (7) ! 217: ! 218: /* Generic register locations */ ! 219: #define MDIO_MMDREG_CTRL1 (0) ! 220: #define MDIO_MMDREG_STAT1 (1) ! 221: #define MDIO_MMDREG_DEVS0 (5) ! 222: #define MDIO_MMDREG_STAT2 (8) ! 223: ! 224: /* Bits in MMDREG_CTRL1 */ ! 225: /* Reset */ ! 226: #define MDIO_MMDREG_CTRL1_RESET_LBN (15) ! 227: #define MDIO_MMDREG_CTRL1_RESET_WIDTH (1) ! 228: ! 229: /* Bits in MMDREG_STAT1 */ ! 230: #define MDIO_MMDREG_STAT1_FAULT_LBN (7) ! 231: #define MDIO_MMDREG_STAT1_FAULT_WIDTH (1) ! 232: ! 233: /* Link state */ ! 234: #define MDIO_MMDREG_STAT1_LINK_LBN (2) ! 235: #define MDIO_MMDREG_STAT1_LINK_WIDTH (1) ! 236: ! 237: /* Bits in MMDREG_DEVS0. */ ! 238: #define DEV_PRESENT_BIT(_b) (1 << _b) ! 239: ! 240: #define MDIO_MMDREG_DEVS0_DTEXS DEV_PRESENT_BIT(MDIO_MMD_DTEXS) ! 241: #define MDIO_MMDREG_DEVS0_PHYXS DEV_PRESENT_BIT(MDIO_MMD_PHYXS) ! 242: #define MDIO_MMDREG_DEVS0_PCS DEV_PRESENT_BIT(MDIO_MMD_PCS) ! 243: #define MDIO_MMDREG_DEVS0_WIS DEV_PRESENT_BIT(MDIO_MMD_WIS) ! 244: #define MDIO_MMDREG_DEVS0_PMAPMD DEV_PRESENT_BIT(MDIO_MMD_PMAPMD) ! 245: ! 246: #define MDIO_MMDREG_DEVS0_AN DEV_PRESENT_BIT(MDIO_MMD_AN) ! 247: ! 248: /* Bits in MMDREG_STAT2 */ ! 249: #define MDIO_MMDREG_STAT2_PRESENT_VAL (2) ! 250: #define MDIO_MMDREG_STAT2_PRESENT_LBN (14) ! 251: #define MDIO_MMDREG_STAT2_PRESENT_WIDTH (2) ! 252: ! 253: /* PHY XGXS lane state */ ! 254: #define MDIO_PHYXS_LANE_STATE (0x18) ! 255: #define MDIO_PHYXS_LANE_ALIGNED_LBN (12) ! 256: #define MDIO_PHYXS_LANE_SYNC0_LBN (0) ! 257: #define MDIO_PHYXS_LANE_SYNC1_LBN (1) ! 258: #define MDIO_PHYXS_LANE_SYNC2_LBN (2) ! 259: #define MDIO_PHYXS_LANE_SYNC3_LBN (3) ! 260: ! 261: /* This ought to be ridiculous overkill. We expect it to fail rarely */ ! 262: #define MDIO45_RESET_TRIES 100 ! 263: #define MDIO45_RESET_SPINTIME 10 ! 264: ! 265: static int ! 266: mdio_clause45_wait_reset_mmds ( struct efab_nic* efab ) ! 267: { ! 268: int tries = MDIO45_RESET_TRIES; ! 269: int in_reset; ! 270: ! 271: while(tries) { ! 272: int mask = efab->phy_op->mmds; ! 273: int mmd = 0; ! 274: in_reset = 0; ! 275: while(mask) { ! 276: if (mask & 1) { ! 277: int stat = falcon_mdio_read ( efab, mmd, ! 278: MDIO_MMDREG_CTRL1 ); ! 279: if (stat < 0) { ! 280: EFAB_ERR("Failed to read status of MMD %d\n", ! 281: mmd ); ! 282: in_reset = 1; ! 283: break; ! 284: } ! 285: if (stat & (1 << MDIO_MMDREG_CTRL1_RESET_LBN)) ! 286: in_reset |= (1 << mmd); ! 287: } ! 288: mask = mask >> 1; ! 289: mmd++; ! 290: } ! 291: if (!in_reset) ! 292: break; ! 293: tries--; ! 294: mdelay ( MDIO45_RESET_SPINTIME ); ! 295: } ! 296: if (in_reset != 0) { ! 297: EFAB_ERR("Not all MMDs came out of reset in time. MMDs " ! 298: "still in reset: %x\n", in_reset); ! 299: return -ETIMEDOUT; ! 300: } ! 301: return 0; ! 302: } ! 303: ! 304: static int ! 305: mdio_clause45_reset_mmd ( struct efab_nic *efab, int mmd ) ! 306: { ! 307: int tries = MDIO45_RESET_TRIES; ! 308: int ctrl; ! 309: ! 310: falcon_mdio_write ( efab, mmd, MDIO_MMDREG_CTRL1, ! 311: ( 1 << MDIO_MMDREG_CTRL1_RESET_LBN ) ); ! 312: ! 313: /* Wait for the reset bit to clear. */ ! 314: do { ! 315: mdelay ( MDIO45_RESET_SPINTIME ); ! 316: ! 317: ctrl = falcon_mdio_read ( efab, mmd, MDIO_MMDREG_CTRL1 ); ! 318: if ( ~ctrl & ( 1 << MDIO_MMDREG_CTRL1_RESET_LBN ) ) ! 319: return 0; ! 320: } while ( --tries ); ! 321: ! 322: EFAB_ERR ( "Failed to reset mmd %d\n", mmd ); ! 323: ! 324: return -ETIMEDOUT; ! 325: } ! 326: ! 327: static int ! 328: mdio_clause45_links_ok(struct efab_nic *efab ) ! 329: { ! 330: int status, good; ! 331: int ok = 1; ! 332: int mmd = 0; ! 333: int mmd_mask = efab->phy_op->mmds; ! 334: ! 335: while (mmd_mask) { ! 336: if (mmd_mask & 1) { ! 337: /* Double reads because link state is latched, and a ! 338: * read moves the current state into the register */ ! 339: status = falcon_mdio_read ( efab, mmd, ! 340: MDIO_MMDREG_STAT1 ); ! 341: status = falcon_mdio_read ( efab, mmd, ! 342: MDIO_MMDREG_STAT1 ); ! 343: ! 344: good = status & (1 << MDIO_MMDREG_STAT1_LINK_LBN); ! 345: ok = ok && good; ! 346: } ! 347: mmd_mask = (mmd_mask >> 1); ! 348: mmd++; ! 349: } ! 350: return ok; ! 351: } ! 352: ! 353: static int ! 354: mdio_clause45_check_mmds ( struct efab_nic *efab ) ! 355: { ! 356: int mmd = 0; ! 357: int devices = falcon_mdio_read ( efab, MDIO_MMD_PHYXS, ! 358: MDIO_MMDREG_DEVS0 ); ! 359: int mmd_mask = efab->phy_op->mmds; ! 360: ! 361: /* Check all the expected MMDs are present */ ! 362: if ( devices < 0 ) { ! 363: EFAB_ERR ( "Failed to read devices present\n" ); ! 364: return -EIO; ! 365: } ! 366: if ( ( devices & mmd_mask ) != mmd_mask ) { ! 367: EFAB_ERR ( "required MMDs not present: got %x, wanted %x\n", ! 368: devices, mmd_mask ); ! 369: return -EIO; ! 370: } ! 371: ! 372: /* Check all required MMDs are responding and happy. */ ! 373: while ( mmd_mask ) { ! 374: if ( mmd_mask & 1 ) { ! 375: efab_dword_t reg; ! 376: int status; ! 377: reg.opaque = falcon_mdio_read ( efab, mmd, ! 378: MDIO_MMDREG_STAT2 ); ! 379: status = EFAB_DWORD_FIELD ( reg, ! 380: MDIO_MMDREG_STAT2_PRESENT ); ! 381: if ( status != MDIO_MMDREG_STAT2_PRESENT_VAL ) { ! 382: ! 383: ! 384: return -EIO; ! 385: } ! 386: } ! 387: mmd_mask >>= 1; ! 388: mmd++; ! 389: } ! 390: ! 391: return 0; ! 392: } ! 393: ! 394: /* I/O BAR address register */ ! 395: #define FCN_IOM_IND_ADR_REG 0x0 ! 396: ! 397: /* I/O BAR data register */ ! 398: #define FCN_IOM_IND_DAT_REG 0x4 ! 399: ! 400: /* Address region register */ ! 401: #define FCN_ADR_REGION_REG_KER 0x00 ! 402: #define FCN_ADR_REGION0_LBN 0 ! 403: #define FCN_ADR_REGION0_WIDTH 18 ! 404: #define FCN_ADR_REGION1_LBN 32 ! 405: #define FCN_ADR_REGION1_WIDTH 18 ! 406: #define FCN_ADR_REGION2_LBN 64 ! 407: #define FCN_ADR_REGION2_WIDTH 18 ! 408: #define FCN_ADR_REGION3_LBN 96 ! 409: #define FCN_ADR_REGION3_WIDTH 18 ! 410: ! 411: /* Interrupt enable register */ ! 412: #define FCN_INT_EN_REG_KER 0x0010 ! 413: #define FCN_MEM_PERR_INT_EN_KER_LBN 5 ! 414: #define FCN_MEM_PERR_INT_EN_KER_WIDTH 1 ! 415: #define FCN_KER_INT_CHAR_LBN 4 ! 416: #define FCN_KER_INT_CHAR_WIDTH 1 ! 417: #define FCN_KER_INT_KER_LBN 3 ! 418: #define FCN_KER_INT_KER_WIDTH 1 ! 419: #define FCN_ILL_ADR_ERR_INT_EN_KER_LBN 2 ! 420: #define FCN_ILL_ADR_ERR_INT_EN_KER_WIDTH 1 ! 421: #define FCN_SRM_PERR_INT_EN_KER_LBN 1 ! 422: #define FCN_SRM_PERR_INT_EN_KER_WIDTH 1 ! 423: #define FCN_DRV_INT_EN_KER_LBN 0 ! 424: #define FCN_DRV_INT_EN_KER_WIDTH 1 ! 425: ! 426: /* Interrupt status register */ ! 427: #define FCN_INT_ADR_REG_KER 0x0030 ! 428: #define FCN_INT_ADR_KER_LBN 0 ! 429: #define FCN_INT_ADR_KER_WIDTH EFAB_DMA_TYPE_WIDTH ( 64 ) ! 430: ! 431: /* Interrupt status register (B0 only) */ ! 432: #define INT_ISR0_B0 0x90 ! 433: #define INT_ISR1_B0 0xA0 ! 434: ! 435: /* Interrupt acknowledge register (A0/A1 only) */ ! 436: #define FCN_INT_ACK_KER_REG_A1 0x0050 ! 437: #define INT_ACK_DUMMY_DATA_LBN 0 ! 438: #define INT_ACK_DUMMY_DATA_WIDTH 32 ! 439: ! 440: /* Interrupt acknowledge work-around register (A0/A1 only )*/ ! 441: #define WORK_AROUND_BROKEN_PCI_READS_REG_KER_A1 0x0070 ! 442: ! 443: /* Hardware initialisation register */ ! 444: #define FCN_HW_INIT_REG_KER 0x00c0 ! 445: #define FCN_BCSR_TARGET_MASK_LBN 101 ! 446: #define FCN_BCSR_TARGET_MASK_WIDTH 4 ! 447: ! 448: /* SPI host command register */ ! 449: #define FCN_EE_SPI_HCMD_REG 0x0100 ! 450: #define FCN_EE_SPI_HCMD_CMD_EN_LBN 31 ! 451: #define FCN_EE_SPI_HCMD_CMD_EN_WIDTH 1 ! 452: #define FCN_EE_WR_TIMER_ACTIVE_LBN 28 ! 453: #define FCN_EE_WR_TIMER_ACTIVE_WIDTH 1 ! 454: #define FCN_EE_SPI_HCMD_SF_SEL_LBN 24 ! 455: #define FCN_EE_SPI_HCMD_SF_SEL_WIDTH 1 ! 456: #define FCN_EE_SPI_EEPROM 0 ! 457: #define FCN_EE_SPI_FLASH 1 ! 458: #define FCN_EE_SPI_HCMD_DABCNT_LBN 16 ! 459: #define FCN_EE_SPI_HCMD_DABCNT_WIDTH 5 ! 460: #define FCN_EE_SPI_HCMD_READ_LBN 15 ! 461: #define FCN_EE_SPI_HCMD_READ_WIDTH 1 ! 462: #define FCN_EE_SPI_READ 1 ! 463: #define FCN_EE_SPI_WRITE 0 ! 464: #define FCN_EE_SPI_HCMD_DUBCNT_LBN 12 ! 465: #define FCN_EE_SPI_HCMD_DUBCNT_WIDTH 2 ! 466: #define FCN_EE_SPI_HCMD_ADBCNT_LBN 8 ! 467: #define FCN_EE_SPI_HCMD_ADBCNT_WIDTH 2 ! 468: #define FCN_EE_SPI_HCMD_ENC_LBN 0 ! 469: #define FCN_EE_SPI_HCMD_ENC_WIDTH 8 ! 470: ! 471: /* SPI host address register */ ! 472: #define FCN_EE_SPI_HADR_REG 0x0110 ! 473: #define FCN_EE_SPI_HADR_DUBYTE_LBN 24 ! 474: #define FCN_EE_SPI_HADR_DUBYTE_WIDTH 8 ! 475: #define FCN_EE_SPI_HADR_ADR_LBN 0 ! 476: #define FCN_EE_SPI_HADR_ADR_WIDTH 24 ! 477: ! 478: /* SPI host data register */ ! 479: #define FCN_EE_SPI_HDATA_REG 0x0120 ! 480: #define FCN_EE_SPI_HDATA3_LBN 96 ! 481: #define FCN_EE_SPI_HDATA3_WIDTH 32 ! 482: #define FCN_EE_SPI_HDATA2_LBN 64 ! 483: #define FCN_EE_SPI_HDATA2_WIDTH 32 ! 484: #define FCN_EE_SPI_HDATA1_LBN 32 ! 485: #define FCN_EE_SPI_HDATA1_WIDTH 32 ! 486: #define FCN_EE_SPI_HDATA0_LBN 0 ! 487: #define FCN_EE_SPI_HDATA0_WIDTH 32 ! 488: ! 489: /* VPD Config 0 Register register */ ! 490: #define FCN_EE_VPD_CFG_REG 0x0140 ! 491: #define FCN_EE_VPD_EN_LBN 0 ! 492: #define FCN_EE_VPD_EN_WIDTH 1 ! 493: #define FCN_EE_VPD_EN_AD9_MODE_LBN 1 ! 494: #define FCN_EE_VPD_EN_AD9_MODE_WIDTH 1 ! 495: #define FCN_EE_EE_CLOCK_DIV_LBN 112 ! 496: #define FCN_EE_EE_CLOCK_DIV_WIDTH 7 ! 497: #define FCN_EE_SF_CLOCK_DIV_LBN 120 ! 498: #define FCN_EE_SF_CLOCK_DIV_WIDTH 7 ! 499: ! 500: ! 501: /* NIC status register */ ! 502: #define FCN_NIC_STAT_REG 0x0200 ! 503: #define FCN_ONCHIP_SRAM_LBN 16 ! 504: #define FCN_ONCHIP_SRAM_WIDTH 1 ! 505: #define FCN_SF_PRST_LBN 9 ! 506: #define FCN_SF_PRST_WIDTH 1 ! 507: #define FCN_EE_PRST_LBN 8 ! 508: #define FCN_EE_PRST_WIDTH 1 ! 509: #define FCN_EE_STRAP_LBN 7 ! 510: #define FCN_EE_STRAP_WIDTH 1 ! 511: #define FCN_PCI_PCIX_MODE_LBN 4 ! 512: #define FCN_PCI_PCIX_MODE_WIDTH 3 ! 513: #define FCN_PCI_PCIX_MODE_PCI33_DECODE 0 ! 514: #define FCN_PCI_PCIX_MODE_PCI66_DECODE 1 ! 515: #define FCN_PCI_PCIX_MODE_PCIX66_DECODE 5 ! 516: #define FCN_PCI_PCIX_MODE_PCIX100_DECODE 6 ! 517: #define FCN_PCI_PCIX_MODE_PCIX133_DECODE 7 ! 518: #define FCN_STRAP_ISCSI_EN_LBN 3 ! 519: #define FCN_STRAP_ISCSI_EN_WIDTH 1 ! 520: #define FCN_STRAP_PINS_LBN 0 ! 521: #define FCN_STRAP_PINS_WIDTH 3 ! 522: #define FCN_STRAP_10G_LBN 2 ! 523: #define FCN_STRAP_10G_WIDTH 1 ! 524: #define FCN_STRAP_DUAL_PORT_LBN 1 ! 525: #define FCN_STRAP_DUAL_PORT_WIDTH 1 ! 526: #define FCN_STRAP_PCIE_LBN 0 ! 527: #define FCN_STRAP_PCIE_WIDTH 1 ! 528: ! 529: /* Falcon revisions */ ! 530: #define FALCON_REV_A0 0 ! 531: #define FALCON_REV_A1 1 ! 532: #define FALCON_REV_B0 2 ! 533: ! 534: /* GPIO control register */ ! 535: #define FCN_GPIO_CTL_REG_KER 0x0210 ! 536: #define FCN_GPIO_CTL_REG_KER 0x0210 ! 537: ! 538: #define FCN_GPIO3_OEN_LBN 27 ! 539: #define FCN_GPIO3_OEN_WIDTH 1 ! 540: #define FCN_GPIO2_OEN_LBN 26 ! 541: #define FCN_GPIO2_OEN_WIDTH 1 ! 542: #define FCN_GPIO1_OEN_LBN 25 ! 543: #define FCN_GPIO1_OEN_WIDTH 1 ! 544: #define FCN_GPIO0_OEN_LBN 24 ! 545: #define FCN_GPIO0_OEN_WIDTH 1 ! 546: ! 547: #define FCN_GPIO3_OUT_LBN 19 ! 548: #define FCN_GPIO3_OUT_WIDTH 1 ! 549: #define FCN_GPIO2_OUT_LBN 18 ! 550: #define FCN_GPIO2_OUT_WIDTH 1 ! 551: #define FCN_GPIO1_OUT_LBN 17 ! 552: #define FCN_GPIO1_OUT_WIDTH 1 ! 553: #define FCN_GPIO0_OUT_LBN 16 ! 554: #define FCN_GPIO0_OUT_WIDTH 1 ! 555: ! 556: #define FCN_GPIO3_IN_LBN 11 ! 557: #define FCN_GPIO3_IN_WIDTH 1 ! 558: #define FCN_GPIO2_IN_LBN 10 ! 559: #define FCN_GPIO2_IN_WIDTH 1 ! 560: #define FCN_GPIO1_IN_LBN 9 ! 561: #define FCN_GPIO1_IN_WIDTH 1 ! 562: #define FCN_GPIO0_IN_LBN 8 ! 563: #define FCN_GPIO0_IN_WIDTH 1 ! 564: ! 565: #define FCN_FLASH_PRESENT_LBN 7 ! 566: #define FCN_FLASH_PRESENT_WIDTH 1 ! 567: #define FCN_EEPROM_PRESENT_LBN 6 ! 568: #define FCN_EEPROM_PRESENT_WIDTH 1 ! 569: #define FCN_BOOTED_USING_NVDEVICE_LBN 3 ! 570: #define FCN_BOOTED_USING_NVDEVICE_WIDTH 1 ! 571: ! 572: /* Defines for extra non-volatile storage */ ! 573: #define FCN_NV_MAGIC_NUMBER 0xFA1C ! 574: ! 575: /* Global control register */ ! 576: #define FCN_GLB_CTL_REG_KER 0x0220 ! 577: #define FCN_EXT_PHY_RST_CTL_LBN 63 ! 578: #define FCN_EXT_PHY_RST_CTL_WIDTH 1 ! 579: #define FCN_PCIE_SD_RST_CTL_LBN 61 ! 580: #define FCN_PCIE_SD_RST_CTL_WIDTH 1 ! 581: #define FCN_PCIE_STCK_RST_CTL_LBN 59 ! 582: #define FCN_PCIE_STCK_RST_CTL_WIDTH 1 ! 583: #define FCN_PCIE_NSTCK_RST_CTL_LBN 58 ! 584: #define FCN_PCIE_NSTCK_RST_CTL_WIDTH 1 ! 585: #define FCN_PCIE_CORE_RST_CTL_LBN 57 ! 586: #define FCN_PCIE_CORE_RST_CTL_WIDTH 1 ! 587: #define FCN_EE_RST_CTL_LBN 49 ! 588: #define FCN_EE_RST_CTL_WIDTH 1 ! 589: #define FCN_RST_EXT_PHY_LBN 31 ! 590: #define FCN_RST_EXT_PHY_WIDTH 1 ! 591: #define FCN_EXT_PHY_RST_DUR_LBN 1 ! 592: #define FCN_EXT_PHY_RST_DUR_WIDTH 3 ! 593: #define FCN_SWRST_LBN 0 ! 594: #define FCN_SWRST_WIDTH 1 ! 595: #define INCLUDE_IN_RESET 0 ! 596: #define EXCLUDE_FROM_RESET 1 ! 597: ! 598: /* FPGA build version */ ! 599: #define FCN_ALTERA_BUILD_REG_KER 0x0300 ! 600: #define FCN_VER_MAJOR_LBN 24 ! 601: #define FCN_VER_MAJOR_WIDTH 8 ! 602: #define FCN_VER_MINOR_LBN 16 ! 603: #define FCN_VER_MINOR_WIDTH 8 ! 604: #define FCN_VER_BUILD_LBN 0 ! 605: #define FCN_VER_BUILD_WIDTH 16 ! 606: #define FCN_VER_ALL_LBN 0 ! 607: #define FCN_VER_ALL_WIDTH 32 ! 608: ! 609: /* Spare EEPROM bits register (flash 0x390) */ ! 610: #define FCN_SPARE_REG_KER 0x310 ! 611: #define FCN_MEM_PERR_EN_TX_DATA_LBN 72 ! 612: #define FCN_MEM_PERR_EN_TX_DATA_WIDTH 2 ! 613: ! 614: /* Timer table for kernel access */ ! 615: #define FCN_TIMER_CMD_REG_KER 0x420 ! 616: #define FCN_TIMER_MODE_LBN 12 ! 617: #define FCN_TIMER_MODE_WIDTH 2 ! 618: #define FCN_TIMER_MODE_DIS 0 ! 619: #define FCN_TIMER_MODE_INT_HLDOFF 1 ! 620: #define FCN_TIMER_VAL_LBN 0 ! 621: #define FCN_TIMER_VAL_WIDTH 12 ! 622: ! 623: /* Receive configuration register */ ! 624: #define FCN_RX_CFG_REG_KER 0x800 ! 625: #define FCN_RX_XOFF_EN_LBN 0 ! 626: #define FCN_RX_XOFF_EN_WIDTH 1 ! 627: ! 628: /* SRAM receive descriptor cache configuration register */ ! 629: #define FCN_SRM_RX_DC_CFG_REG_KER 0x610 ! 630: #define FCN_SRM_RX_DC_BASE_ADR_LBN 0 ! 631: #define FCN_SRM_RX_DC_BASE_ADR_WIDTH 21 ! 632: ! 633: /* SRAM transmit descriptor cache configuration register */ ! 634: #define FCN_SRM_TX_DC_CFG_REG_KER 0x620 ! 635: #define FCN_SRM_TX_DC_BASE_ADR_LBN 0 ! 636: #define FCN_SRM_TX_DC_BASE_ADR_WIDTH 21 ! 637: ! 638: /* SRAM configuration register */ ! 639: #define FCN_SRM_CFG_REG_KER 0x630 ! 640: #define FCN_SRAM_OOB_ADR_INTEN_LBN 5 ! 641: #define FCN_SRAM_OOB_ADR_INTEN_WIDTH 1 ! 642: #define FCN_SRAM_OOB_BUF_INTEN_LBN 4 ! 643: #define FCN_SRAM_OOB_BUF_INTEN_WIDTH 1 ! 644: #define FCN_SRAM_OOB_BT_INIT_EN_LBN 3 ! 645: #define FCN_SRAM_OOB_BT_INIT_EN_WIDTH 1 ! 646: #define FCN_SRM_NUM_BANK_LBN 2 ! 647: #define FCN_SRM_NUM_BANK_WIDTH 1 ! 648: #define FCN_SRM_BANK_SIZE_LBN 0 ! 649: #define FCN_SRM_BANK_SIZE_WIDTH 2 ! 650: #define FCN_SRM_NUM_BANKS_AND_BANK_SIZE_LBN 0 ! 651: #define FCN_SRM_NUM_BANKS_AND_BANK_SIZE_WIDTH 3 ! 652: ! 653: #define FCN_RX_CFG_REG_KER 0x800 ! 654: #define FCN_RX_INGR_EN_B0_LBN 47 ! 655: #define FCN_RX_INGR_EN_B0_WIDTH 1 ! 656: #define FCN_RX_USR_BUF_SIZE_B0_LBN 19 ! 657: #define FCN_RX_USR_BUF_SIZE_B0_WIDTH 9 ! 658: #define FCN_RX_XON_MAC_TH_B0_LBN 10 ! 659: #define FCN_RX_XON_MAC_TH_B0_WIDTH 9 ! 660: #define FCN_RX_XOFF_MAC_TH_B0_LBN 1 ! 661: #define FCN_RX_XOFF_MAC_TH_B0_WIDTH 9 ! 662: #define FCN_RX_XOFF_MAC_EN_B0_LBN 0 ! 663: #define FCN_RX_XOFF_MAC_EN_B0_WIDTH 1 ! 664: #define FCN_RX_USR_BUF_SIZE_A1_LBN 11 ! 665: #define FCN_RX_USR_BUF_SIZE_A1_WIDTH 9 ! 666: #define FCN_RX_XON_MAC_TH_A1_LBN 6 ! 667: #define FCN_RX_XON_MAC_TH_A1_WIDTH 5 ! 668: #define FCN_RX_XOFF_MAC_TH_A1_LBN 1 ! 669: #define FCN_RX_XOFF_MAC_TH_A1_WIDTH 5 ! 670: #define FCN_RX_XOFF_MAC_EN_A1_LBN 0 ! 671: #define FCN_RX_XOFF_MAC_EN_A1_WIDTH 1 ! 672: ! 673: #define FCN_RX_USR_BUF_SIZE_A1_LBN 11 ! 674: #define FCN_RX_USR_BUF_SIZE_A1_WIDTH 9 ! 675: #define FCN_RX_XOFF_MAC_EN_A1_LBN 0 ! 676: #define FCN_RX_XOFF_MAC_EN_A1_WIDTH 1 ! 677: ! 678: /* Receive filter control register */ ! 679: #define FCN_RX_FILTER_CTL_REG_KER 0x810 ! 680: #define FCN_UDP_FULL_SRCH_LIMIT_LBN 32 ! 681: #define FCN_UDP_FULL_SRCH_LIMIT_WIDTH 8 ! 682: #define FCN_NUM_KER_LBN 24 ! 683: #define FCN_NUM_KER_WIDTH 2 ! 684: #define FCN_UDP_WILD_SRCH_LIMIT_LBN 16 ! 685: #define FCN_UDP_WILD_SRCH_LIMIT_WIDTH 8 ! 686: #define FCN_TCP_WILD_SRCH_LIMIT_LBN 8 ! 687: #define FCN_TCP_WILD_SRCH_LIMIT_WIDTH 8 ! 688: #define FCN_TCP_FULL_SRCH_LIMIT_LBN 0 ! 689: #define FCN_TCP_FULL_SRCH_LIMIT_WIDTH 8 ! 690: ! 691: /* RX queue flush register */ ! 692: #define FCN_RX_FLUSH_DESCQ_REG_KER 0x0820 ! 693: #define FCN_RX_FLUSH_DESCQ_CMD_LBN 24 ! 694: #define FCN_RX_FLUSH_DESCQ_CMD_WIDTH 1 ! 695: #define FCN_RX_FLUSH_DESCQ_LBN 0 ! 696: #define FCN_RX_FLUSH_DESCQ_WIDTH 12 ! 697: ! 698: /* Receive descriptor update register */ ! 699: #define FCN_RX_DESC_UPD_REG_KER 0x0830 ! 700: #define FCN_RX_DESC_WPTR_LBN 96 ! 701: #define FCN_RX_DESC_WPTR_WIDTH 12 ! 702: #define FCN_RX_DESC_UPD_REG_KER_DWORD ( FCN_RX_DESC_UPD_REG_KER + 12 ) ! 703: #define FCN_RX_DESC_WPTR_DWORD_LBN 0 ! 704: #define FCN_RX_DESC_WPTR_DWORD_WIDTH 12 ! 705: ! 706: /* Receive descriptor cache configuration register */ ! 707: #define FCN_RX_DC_CFG_REG_KER 0x840 ! 708: #define FCN_RX_DC_SIZE_LBN 0 ! 709: #define FCN_RX_DC_SIZE_WIDTH 2 ! 710: ! 711: #define FCN_RX_SELF_RST_REG_KER 0x890 ! 712: #define FCN_RX_ISCSI_DIS_LBN 17 ! 713: #define FCN_RX_ISCSI_DIS_WIDTH 1 ! 714: #define FCN_RX_NODESC_WAIT_DIS_LBN 9 ! 715: #define FCN_RX_NODESC_WAIT_DIS_WIDTH 1 ! 716: #define FCN_RX_RECOVERY_EN_LBN 8 ! 717: #define FCN_RX_RECOVERY_EN_WIDTH 1 ! 718: ! 719: /* TX queue flush register */ ! 720: #define FCN_TX_FLUSH_DESCQ_REG_KER 0x0a00 ! 721: #define FCN_TX_FLUSH_DESCQ_CMD_LBN 12 ! 722: #define FCN_TX_FLUSH_DESCQ_CMD_WIDTH 1 ! 723: #define FCN_TX_FLUSH_DESCQ_LBN 0 ! 724: #define FCN_TX_FLUSH_DESCQ_WIDTH 12 ! 725: ! 726: /* Transmit configuration register 2 */ ! 727: #define FCN_TX_CFG2_REG_KER 0xa80 ! 728: #define FCN_TX_DIS_NON_IP_EV_LBN 17 ! 729: #define FCN_TX_DIS_NON_IP_EV_WIDTH 1 ! 730: ! 731: /* Transmit descriptor update register */ ! 732: #define FCN_TX_DESC_UPD_REG_KER 0x0a10 ! 733: #define FCN_TX_DESC_WPTR_LBN 96 ! 734: #define FCN_TX_DESC_WPTR_WIDTH 12 ! 735: #define FCN_TX_DESC_UPD_REG_KER_DWORD ( FCN_TX_DESC_UPD_REG_KER + 12 ) ! 736: #define FCN_TX_DESC_WPTR_DWORD_LBN 0 ! 737: #define FCN_TX_DESC_WPTR_DWORD_WIDTH 12 ! 738: ! 739: /* Transmit descriptor cache configuration register */ ! 740: #define FCN_TX_DC_CFG_REG_KER 0xa20 ! 741: #define FCN_TX_DC_SIZE_LBN 0 ! 742: #define FCN_TX_DC_SIZE_WIDTH 2 ! 743: ! 744: /* PHY management transmit data register */ ! 745: #define FCN_MD_TXD_REG_KER 0xc00 ! 746: #define FCN_MD_TXD_LBN 0 ! 747: #define FCN_MD_TXD_WIDTH 16 ! 748: ! 749: /* PHY management receive data register */ ! 750: #define FCN_MD_RXD_REG_KER 0xc10 ! 751: #define FCN_MD_RXD_LBN 0 ! 752: #define FCN_MD_RXD_WIDTH 16 ! 753: ! 754: /* PHY management configuration & status register */ ! 755: #define FCN_MD_CS_REG_KER 0xc20 ! 756: #define FCN_MD_GC_LBN 4 ! 757: #define FCN_MD_GC_WIDTH 1 ! 758: #define FCN_MD_RIC_LBN 2 ! 759: #define FCN_MD_RIC_WIDTH 1 ! 760: #define FCN_MD_RDC_LBN 1 ! 761: #define FCN_MD_RDC_WIDTH 1 ! 762: #define FCN_MD_WRC_LBN 0 ! 763: #define FCN_MD_WRC_WIDTH 1 ! 764: ! 765: /* PHY management PHY address register */ ! 766: #define FCN_MD_PHY_ADR_REG_KER 0xc30 ! 767: #define FCN_MD_PHY_ADR_LBN 0 ! 768: #define FCN_MD_PHY_ADR_WIDTH 16 ! 769: ! 770: /* PHY management ID register */ ! 771: #define FCN_MD_ID_REG_KER 0xc40 ! 772: #define FCN_MD_PRT_ADR_LBN 11 ! 773: #define FCN_MD_PRT_ADR_WIDTH 5 ! 774: #define FCN_MD_DEV_ADR_LBN 6 ! 775: #define FCN_MD_DEV_ADR_WIDTH 5 ! 776: ! 777: /* PHY management status & mask register */ ! 778: #define FCN_MD_STAT_REG_KER 0xc50 ! 779: #define FCN_MD_PINT_LBN 4 ! 780: #define FCN_MD_PINT_WIDTH 1 ! 781: #define FCN_MD_DONE_LBN 3 ! 782: #define FCN_MD_DONE_WIDTH 1 ! 783: #define FCN_MD_BSERR_LBN 2 ! 784: #define FCN_MD_BSERR_WIDTH 1 ! 785: #define FCN_MD_LNFL_LBN 1 ! 786: #define FCN_MD_LNFL_WIDTH 1 ! 787: #define FCN_MD_BSY_LBN 0 ! 788: #define FCN_MD_BSY_WIDTH 1 ! 789: ! 790: /* Port 0 and 1 MAC control registers */ ! 791: #define FCN_MAC0_CTRL_REG_KER 0xc80 ! 792: #define FCN_MAC1_CTRL_REG_KER 0xc90 ! 793: #define FCN_MAC_XOFF_VAL_LBN 16 ! 794: #define FCN_MAC_XOFF_VAL_WIDTH 16 ! 795: #define FCN_MAC_BCAD_ACPT_LBN 4 ! 796: #define FCN_MAC_BCAD_ACPT_WIDTH 1 ! 797: #define FCN_MAC_UC_PROM_LBN 3 ! 798: #define FCN_MAC_UC_PROM_WIDTH 1 ! 799: #define FCN_MAC_LINK_STATUS_LBN 2 ! 800: #define FCN_MAC_LINK_STATUS_WIDTH 1 ! 801: #define FCN_MAC_SPEED_LBN 0 ! 802: #define FCN_MAC_SPEED_WIDTH 2 ! 803: ! 804: /* 10Gig Xaui XGXS Default Values */ ! 805: #define XX_TXDRV_DEQ_DEFAULT 0xe /* deq=.6 */ ! 806: #define XX_TXDRV_DTX_DEFAULT 0x5 /* 1.25 */ ! 807: #define XX_SD_CTL_DRV_DEFAULT 0 /* 20mA */ ! 808: ! 809: /* GMAC registers */ ! 810: #define FALCON_GMAC_REGBANK 0xe00 ! 811: #define FALCON_GMAC_REGBANK_SIZE 0x200 ! 812: #define FALCON_GMAC_REG_SIZE 0x10 ! 813: ! 814: /* XGMAC registers */ ! 815: #define FALCON_XMAC_REGBANK 0x1200 ! 816: #define FALCON_XMAC_REGBANK_SIZE 0x200 ! 817: #define FALCON_XMAC_REG_SIZE 0x10 ! 818: ! 819: /* XGMAC address register low */ ! 820: #define FCN_XM_ADR_LO_REG_MAC 0x00 ! 821: #define FCN_XM_ADR_3_LBN 24 ! 822: #define FCN_XM_ADR_3_WIDTH 8 ! 823: #define FCN_XM_ADR_2_LBN 16 ! 824: #define FCN_XM_ADR_2_WIDTH 8 ! 825: #define FCN_XM_ADR_1_LBN 8 ! 826: #define FCN_XM_ADR_1_WIDTH 8 ! 827: #define FCN_XM_ADR_0_LBN 0 ! 828: #define FCN_XM_ADR_0_WIDTH 8 ! 829: ! 830: /* XGMAC address register high */ ! 831: #define FCN_XM_ADR_HI_REG_MAC 0x01 ! 832: #define FCN_XM_ADR_5_LBN 8 ! 833: #define FCN_XM_ADR_5_WIDTH 8 ! 834: #define FCN_XM_ADR_4_LBN 0 ! 835: #define FCN_XM_ADR_4_WIDTH 8 ! 836: ! 837: /* XGMAC global configuration - port 0*/ ! 838: #define FCN_XM_GLB_CFG_REG_MAC 0x02 ! 839: #define FCN_XM_RX_STAT_EN_LBN 11 ! 840: #define FCN_XM_RX_STAT_EN_WIDTH 1 ! 841: #define FCN_XM_TX_STAT_EN_LBN 10 ! 842: #define FCN_XM_TX_STAT_EN_WIDTH 1 ! 843: #define FCN_XM_RX_JUMBO_MODE_LBN 6 ! 844: #define FCN_XM_RX_JUMBO_MODE_WIDTH 1 ! 845: #define FCN_XM_CORE_RST_LBN 0 ! 846: #define FCN_XM_CORE_RST_WIDTH 1 ! 847: ! 848: /* XGMAC transmit configuration - port 0 */ ! 849: #define FCN_XM_TX_CFG_REG_MAC 0x03 ! 850: #define FCN_XM_IPG_LBN 16 ! 851: #define FCN_XM_IPG_WIDTH 4 ! 852: #define FCN_XM_FCNTL_LBN 10 ! 853: #define FCN_XM_FCNTL_WIDTH 1 ! 854: #define FCN_XM_TXCRC_LBN 8 ! 855: #define FCN_XM_TXCRC_WIDTH 1 ! 856: #define FCN_XM_AUTO_PAD_LBN 5 ! 857: #define FCN_XM_AUTO_PAD_WIDTH 1 ! 858: #define FCN_XM_TX_PRMBL_LBN 2 ! 859: #define FCN_XM_TX_PRMBL_WIDTH 1 ! 860: #define FCN_XM_TXEN_LBN 1 ! 861: #define FCN_XM_TXEN_WIDTH 1 ! 862: ! 863: /* XGMAC receive configuration - port 0 */ ! 864: #define FCN_XM_RX_CFG_REG_MAC 0x04 ! 865: #define FCN_XM_PASS_CRC_ERR_LBN 25 ! 866: #define FCN_XM_PASS_CRC_ERR_WIDTH 1 ! 867: #define FCN_XM_AUTO_DEPAD_LBN 8 ! 868: #define FCN_XM_AUTO_DEPAD_WIDTH 1 ! 869: #define FCN_XM_RXEN_LBN 1 ! 870: #define FCN_XM_RXEN_WIDTH 1 ! 871: ! 872: /* XGMAC management interrupt mask register */ ! 873: #define FCN_XM_MGT_INT_MSK_REG_MAC_B0 0x5 ! 874: #define FCN_XM_MSK_PRMBLE_ERR_LBN 2 ! 875: #define FCN_XM_MSK_PRMBLE_ERR_WIDTH 1 ! 876: #define FCN_XM_MSK_RMTFLT_LBN 1 ! 877: #define FCN_XM_MSK_RMTFLT_WIDTH 1 ! 878: #define FCN_XM_MSK_LCLFLT_LBN 0 ! 879: #define FCN_XM_MSK_LCLFLT_WIDTH 1 ! 880: ! 881: /* XGMAC flow control register */ ! 882: #define FCN_XM_FC_REG_MAC 0x7 ! 883: #define FCN_XM_PAUSE_TIME_LBN 16 ! 884: #define FCN_XM_PAUSE_TIME_WIDTH 16 ! 885: #define FCN_XM_DIS_FCNTL_LBN 0 ! 886: #define FCN_XM_DIS_FCNTL_WIDTH 1 ! 887: ! 888: /* XGMAC transmit parameter register */ ! 889: #define FCN_XM_TX_PARAM_REG_MAC 0x0d ! 890: #define FCN_XM_TX_JUMBO_MODE_LBN 31 ! 891: #define FCN_XM_TX_JUMBO_MODE_WIDTH 1 ! 892: #define FCN_XM_MAX_TX_FRM_SIZE_LBN 16 ! 893: #define FCN_XM_MAX_TX_FRM_SIZE_WIDTH 14 ! 894: #define FCN_XM_ACPT_ALL_MCAST_LBN 11 ! 895: #define FCN_XM_ACPT_ALL_MCAST_WIDTH 1 ! 896: ! 897: /* XGMAC receive parameter register */ ! 898: #define FCN_XM_RX_PARAM_REG_MAC 0x0e ! 899: #define FCN_XM_MAX_RX_FRM_SIZE_LBN 0 ! 900: #define FCN_XM_MAX_RX_FRM_SIZE_WIDTH 14 ! 901: ! 902: /* XGMAC management interrupt status register */ ! 903: #define FCN_XM_MGT_INT_REG_MAC_B0 0x0f ! 904: #define FCN_XM_PRMBLE_ERR 2 ! 905: #define FCN_XM_PRMBLE_WIDTH 1 ! 906: #define FCN_XM_RMTFLT_LBN 1 ! 907: #define FCN_XM_RMTFLT_WIDTH 1 ! 908: #define FCN_XM_LCLFLT_LBN 0 ! 909: #define FCN_XM_LCLFLT_WIDTH 1 ! 910: ! 911: /* XAUI XGXS core status register */ ! 912: #define FCN_XX_ALIGN_DONE_LBN 20 ! 913: #define FCN_XX_ALIGN_DONE_WIDTH 1 ! 914: #define FCN_XX_CORE_STAT_REG_MAC 0x16 ! 915: #define FCN_XX_SYNC_STAT_LBN 16 ! 916: #define FCN_XX_SYNC_STAT_WIDTH 4 ! 917: #define FCN_XX_SYNC_STAT_DECODE_SYNCED 0xf ! 918: #define FCN_XX_COMMA_DET_LBN 12 ! 919: #define FCN_XX_COMMA_DET_WIDTH 4 ! 920: #define FCN_XX_COMMA_DET_RESET 0xf ! 921: #define FCN_XX_CHARERR_LBN 4 ! 922: #define FCN_XX_CHARERR_WIDTH 4 ! 923: #define FCN_XX_CHARERR_RESET 0xf ! 924: #define FCN_XX_DISPERR_LBN 0 ! 925: #define FCN_XX_DISPERR_WIDTH 4 ! 926: #define FCN_XX_DISPERR_RESET 0xf ! 927: ! 928: /* XGXS/XAUI powerdown/reset register */ ! 929: #define FCN_XX_PWR_RST_REG_MAC 0x10 ! 930: #define FCN_XX_PWRDND_EN_LBN 15 ! 931: #define FCN_XX_PWRDND_EN_WIDTH 1 ! 932: #define FCN_XX_PWRDNC_EN_LBN 14 ! 933: #define FCN_XX_PWRDNC_EN_WIDTH 1 ! 934: #define FCN_XX_PWRDNB_EN_LBN 13 ! 935: #define FCN_XX_PWRDNB_EN_WIDTH 1 ! 936: #define FCN_XX_PWRDNA_EN_LBN 12 ! 937: #define FCN_XX_PWRDNA_EN_WIDTH 1 ! 938: #define FCN_XX_RSTPLLCD_EN_LBN 9 ! 939: #define FCN_XX_RSTPLLCD_EN_WIDTH 1 ! 940: #define FCN_XX_RSTPLLAB_EN_LBN 8 ! 941: #define FCN_XX_RSTPLLAB_EN_WIDTH 1 ! 942: #define FCN_XX_RESETD_EN_LBN 7 ! 943: #define FCN_XX_RESETD_EN_WIDTH 1 ! 944: #define FCN_XX_RESETC_EN_LBN 6 ! 945: #define FCN_XX_RESETC_EN_WIDTH 1 ! 946: #define FCN_XX_RESETB_EN_LBN 5 ! 947: #define FCN_XX_RESETB_EN_WIDTH 1 ! 948: #define FCN_XX_RESETA_EN_LBN 4 ! 949: #define FCN_XX_RESETA_EN_WIDTH 1 ! 950: #define FCN_XX_RSTXGXSRX_EN_LBN 2 ! 951: #define FCN_XX_RSTXGXSRX_EN_WIDTH 1 ! 952: #define FCN_XX_RSTXGXSTX_EN_LBN 1 ! 953: #define FCN_XX_RSTXGXSTX_EN_WIDTH 1 ! 954: #define FCN_XX_RST_XX_EN_LBN 0 ! 955: #define FCN_XX_RST_XX_EN_WIDTH 1 ! 956: ! 957: ! 958: /* XGXS/XAUI powerdown/reset control register */ ! 959: #define FCN_XX_SD_CTL_REG_MAC 0x11 ! 960: #define FCN_XX_TERMADJ1_LBN 17 ! 961: #define FCN_XX_TERMADJ1_WIDTH 1 ! 962: #define FCN_XX_TERMADJ0_LBN 16 ! 963: #define FCN_XX_TERMADJ0_WIDTH 1 ! 964: #define FCN_XX_HIDRVD_LBN 15 ! 965: #define FCN_XX_HIDRVD_WIDTH 1 ! 966: #define FCN_XX_LODRVD_LBN 14 ! 967: #define FCN_XX_LODRVD_WIDTH 1 ! 968: #define FCN_XX_HIDRVC_LBN 13 ! 969: #define FCN_XX_HIDRVC_WIDTH 1 ! 970: #define FCN_XX_LODRVC_LBN 12 ! 971: #define FCN_XX_LODRVC_WIDTH 1 ! 972: #define FCN_XX_HIDRVB_LBN 11 ! 973: #define FCN_XX_HIDRVB_WIDTH 1 ! 974: #define FCN_XX_LODRVB_LBN 10 ! 975: #define FCN_XX_LODRVB_WIDTH 1 ! 976: #define FCN_XX_HIDRVA_LBN 9 ! 977: #define FCN_XX_HIDRVA_WIDTH 1 ! 978: #define FCN_XX_LODRVA_LBN 8 ! 979: #define FCN_XX_LODRVA_WIDTH 1 ! 980: #define FCN_XX_LPBKD_LBN 3 ! 981: #define FCN_XX_LPBKD_WIDTH 1 ! 982: #define FCN_XX_LPBKC_LBN 2 ! 983: #define FCN_XX_LPBKC_WIDTH 1 ! 984: #define FCN_XX_LPBKB_LBN 1 ! 985: #define FCN_XX_LPBKB_WIDTH 1 ! 986: #define FCN_XX_LPBKA_LBN 0 ! 987: #define FCN_XX_LPBKA_WIDTH 1 ! 988: ! 989: #define FCN_XX_TXDRV_CTL_REG_MAC 0x12 ! 990: #define FCN_XX_DEQD_LBN 28 ! 991: #define FCN_XX_DEQD_WIDTH 4 ! 992: #define FCN_XX_DEQC_LBN 24 ! 993: #define FCN_XX_DEQC_WIDTH 4 ! 994: #define FCN_XX_DEQB_LBN 20 ! 995: #define FCN_XX_DEQB_WIDTH 4 ! 996: #define FCN_XX_DEQA_LBN 16 ! 997: #define FCN_XX_DEQA_WIDTH 4 ! 998: #define FCN_XX_DTXD_LBN 12 ! 999: #define FCN_XX_DTXD_WIDTH 4 ! 1000: #define FCN_XX_DTXC_LBN 8 ! 1001: #define FCN_XX_DTXC_WIDTH 4 ! 1002: #define FCN_XX_DTXB_LBN 4 ! 1003: #define FCN_XX_DTXB_WIDTH 4 ! 1004: #define FCN_XX_DTXA_LBN 0 ! 1005: #define FCN_XX_DTXA_WIDTH 4 ! 1006: ! 1007: /* Receive filter table */ ! 1008: #define FCN_RX_FILTER_TBL0 0xF00000 ! 1009: ! 1010: /* Receive descriptor pointer table */ ! 1011: #define FCN_RX_DESC_PTR_TBL_KER_A1 0x11800 ! 1012: #define FCN_RX_DESC_PTR_TBL_KER_B0 0xF40000 ! 1013: #define FCN_RX_ISCSI_DDIG_EN_LBN 88 ! 1014: #define FCN_RX_ISCSI_DDIG_EN_WIDTH 1 ! 1015: #define FCN_RX_ISCSI_HDIG_EN_LBN 87 ! 1016: #define FCN_RX_ISCSI_HDIG_EN_WIDTH 1 ! 1017: #define FCN_RX_DESCQ_BUF_BASE_ID_LBN 36 ! 1018: #define FCN_RX_DESCQ_BUF_BASE_ID_WIDTH 20 ! 1019: #define FCN_RX_DESCQ_EVQ_ID_LBN 24 ! 1020: #define FCN_RX_DESCQ_EVQ_ID_WIDTH 12 ! 1021: #define FCN_RX_DESCQ_OWNER_ID_LBN 10 ! 1022: #define FCN_RX_DESCQ_OWNER_ID_WIDTH 14 ! 1023: #define FCN_RX_DESCQ_SIZE_LBN 3 ! 1024: #define FCN_RX_DESCQ_SIZE_WIDTH 2 ! 1025: #define FCN_RX_DESCQ_SIZE_4K 3 ! 1026: #define FCN_RX_DESCQ_SIZE_2K 2 ! 1027: #define FCN_RX_DESCQ_SIZE_1K 1 ! 1028: #define FCN_RX_DESCQ_SIZE_512 0 ! 1029: #define FCN_RX_DESCQ_TYPE_LBN 2 ! 1030: #define FCN_RX_DESCQ_TYPE_WIDTH 1 ! 1031: #define FCN_RX_DESCQ_JUMBO_LBN 1 ! 1032: #define FCN_RX_DESCQ_JUMBO_WIDTH 1 ! 1033: #define FCN_RX_DESCQ_EN_LBN 0 ! 1034: #define FCN_RX_DESCQ_EN_WIDTH 1 ! 1035: ! 1036: /* Transmit descriptor pointer table */ ! 1037: #define FCN_TX_DESC_PTR_TBL_KER_A1 0x11900 ! 1038: #define FCN_TX_DESC_PTR_TBL_KER_B0 0xF50000 ! 1039: #define FCN_TX_NON_IP_DROP_DIS_B0_LBN 91 ! 1040: #define FCN_TX_NON_IP_DROP_DIS_B0_WIDTH 1 ! 1041: #define FCN_TX_DESCQ_EN_LBN 88 ! 1042: #define FCN_TX_DESCQ_EN_WIDTH 1 ! 1043: #define FCN_TX_ISCSI_DDIG_EN_LBN 87 ! 1044: #define FCN_TX_ISCSI_DDIG_EN_WIDTH 1 ! 1045: #define FCN_TX_ISCSI_HDIG_EN_LBN 86 ! 1046: #define FCN_TX_ISCSI_HDIG_EN_WIDTH 1 ! 1047: #define FCN_TX_DESCQ_BUF_BASE_ID_LBN 36 ! 1048: #define FCN_TX_DESCQ_BUF_BASE_ID_WIDTH 20 ! 1049: #define FCN_TX_DESCQ_EVQ_ID_LBN 24 ! 1050: #define FCN_TX_DESCQ_EVQ_ID_WIDTH 12 ! 1051: #define FCN_TX_DESCQ_OWNER_ID_LBN 10 ! 1052: #define FCN_TX_DESCQ_OWNER_ID_WIDTH 14 ! 1053: #define FCN_TX_DESCQ_SIZE_LBN 3 ! 1054: #define FCN_TX_DESCQ_SIZE_WIDTH 2 ! 1055: #define FCN_TX_DESCQ_SIZE_4K 3 ! 1056: #define FCN_TX_DESCQ_SIZE_2K 2 ! 1057: #define FCN_TX_DESCQ_SIZE_1K 1 ! 1058: #define FCN_TX_DESCQ_SIZE_512 0 ! 1059: #define FCN_TX_DESCQ_TYPE_LBN 1 ! 1060: #define FCN_TX_DESCQ_TYPE_WIDTH 2 ! 1061: #define FCN_TX_DESCQ_FLUSH_LBN 0 ! 1062: #define FCN_TX_DESCQ_FLUSH_WIDTH 1 ! 1063: ! 1064: /* Event queue pointer */ ! 1065: #define FCN_EVQ_PTR_TBL_KER_A1 0x11a00 ! 1066: #define FCN_EVQ_PTR_TBL_KER_B0 0xf60000 ! 1067: #define FCN_EVQ_EN_LBN 23 ! 1068: #define FCN_EVQ_EN_WIDTH 1 ! 1069: #define FCN_EVQ_SIZE_LBN 20 ! 1070: #define FCN_EVQ_SIZE_WIDTH 3 ! 1071: #define FCN_EVQ_SIZE_32K 6 ! 1072: #define FCN_EVQ_SIZE_16K 5 ! 1073: #define FCN_EVQ_SIZE_8K 4 ! 1074: #define FCN_EVQ_SIZE_4K 3 ! 1075: #define FCN_EVQ_SIZE_2K 2 ! 1076: #define FCN_EVQ_SIZE_1K 1 ! 1077: #define FCN_EVQ_SIZE_512 0 ! 1078: #define FCN_EVQ_BUF_BASE_ID_LBN 0 ! 1079: #define FCN_EVQ_BUF_BASE_ID_WIDTH 20 ! 1080: ! 1081: /* RSS indirection table */ ! 1082: #define FCN_RX_RSS_INDIR_TBL_B0 0xFB0000 ! 1083: ! 1084: /* Event queue read pointer */ ! 1085: #define FCN_EVQ_RPTR_REG_KER_A1 0x11b00 ! 1086: #define FCN_EVQ_RPTR_REG_KER_B0 0xfa0000 ! 1087: #define FCN_EVQ_RPTR_LBN 0 ! 1088: #define FCN_EVQ_RPTR_WIDTH 14 ! 1089: #define FCN_EVQ_RPTR_REG_KER_DWORD_A1 ( FCN_EVQ_RPTR_REG_KER_A1 + 0 ) ! 1090: #define FCN_EVQ_RPTR_REG_KER_DWORD_B0 ( FCN_EVQ_RPTR_REG_KER_B0 + 0 ) ! 1091: #define FCN_EVQ_RPTR_DWORD_LBN 0 ! 1092: #define FCN_EVQ_RPTR_DWORD_WIDTH 14 ! 1093: ! 1094: /* Special buffer descriptors */ ! 1095: #define FCN_BUF_FULL_TBL_KER_A1 0x18000 ! 1096: #define FCN_BUF_FULL_TBL_KER_B0 0x800000 ! 1097: #define FCN_IP_DAT_BUF_SIZE_LBN 50 ! 1098: #define FCN_IP_DAT_BUF_SIZE_WIDTH 1 ! 1099: #define FCN_IP_DAT_BUF_SIZE_8K 1 ! 1100: #define FCN_IP_DAT_BUF_SIZE_4K 0 ! 1101: #define FCN_BUF_ADR_FBUF_LBN 14 ! 1102: #define FCN_BUF_ADR_FBUF_WIDTH 34 ! 1103: #define FCN_BUF_OWNER_ID_FBUF_LBN 0 ! 1104: #define FCN_BUF_OWNER_ID_FBUF_WIDTH 14 ! 1105: ! 1106: /** Offset of a GMAC register within Falcon */ ! 1107: #define FALCON_GMAC_REG( efab, mac_reg ) \ ! 1108: ( FALCON_GMAC_REGBANK + \ ! 1109: ( (mac_reg) * FALCON_GMAC_REG_SIZE ) ) ! 1110: ! 1111: /** Offset of an XMAC register within Falcon */ ! 1112: #define FALCON_XMAC_REG( efab_port, mac_reg ) \ ! 1113: ( FALCON_XMAC_REGBANK + \ ! 1114: ( (mac_reg) * FALCON_XMAC_REG_SIZE ) ) ! 1115: ! 1116: #define FCN_MAC_DATA_LBN 0 ! 1117: #define FCN_MAC_DATA_WIDTH 32 ! 1118: ! 1119: /* Transmit descriptor */ ! 1120: #define FCN_TX_KER_PORT_LBN 63 ! 1121: #define FCN_TX_KER_PORT_WIDTH 1 ! 1122: #define FCN_TX_KER_BYTE_CNT_LBN 48 ! 1123: #define FCN_TX_KER_BYTE_CNT_WIDTH 14 ! 1124: #define FCN_TX_KER_BUF_ADR_LBN 0 ! 1125: #define FCN_TX_KER_BUF_ADR_WIDTH EFAB_DMA_TYPE_WIDTH ( 46 ) ! 1126: ! 1127: ! 1128: /* Receive descriptor */ ! 1129: #define FCN_RX_KER_BUF_SIZE_LBN 48 ! 1130: #define FCN_RX_KER_BUF_SIZE_WIDTH 14 ! 1131: #define FCN_RX_KER_BUF_ADR_LBN 0 ! 1132: #define FCN_RX_KER_BUF_ADR_WIDTH EFAB_DMA_TYPE_WIDTH ( 46 ) ! 1133: ! 1134: /* Event queue entries */ ! 1135: #define FCN_EV_CODE_LBN 60 ! 1136: #define FCN_EV_CODE_WIDTH 4 ! 1137: #define FCN_RX_IP_EV_DECODE 0 ! 1138: #define FCN_TX_IP_EV_DECODE 2 ! 1139: #define FCN_DRIVER_EV_DECODE 5 ! 1140: ! 1141: /* Receive events */ ! 1142: #define FCN_RX_EV_PKT_OK_LBN 56 ! 1143: #define FCN_RX_EV_PKT_OK_WIDTH 1 ! 1144: #define FCN_RX_PORT_LBN 30 ! 1145: #define FCN_RX_PORT_WIDTH 1 ! 1146: #define FCN_RX_EV_BYTE_CNT_LBN 16 ! 1147: #define FCN_RX_EV_BYTE_CNT_WIDTH 14 ! 1148: #define FCN_RX_EV_DESC_PTR_LBN 0 ! 1149: #define FCN_RX_EV_DESC_PTR_WIDTH 12 ! 1150: ! 1151: /* Transmit events */ ! 1152: #define FCN_TX_EV_DESC_PTR_LBN 0 ! 1153: #define FCN_TX_EV_DESC_PTR_WIDTH 12 ! 1154: ! 1155: /******************************************************************************* ! 1156: * ! 1157: * ! 1158: * Low-level hardware access ! 1159: * ! 1160: * ! 1161: *******************************************************************************/ ! 1162: ! 1163: #define FCN_REVISION_REG(efab, reg) \ ! 1164: ( ( efab->pci_revision == FALCON_REV_B0 ) ? reg ## _B0 : reg ## _A1 ) ! 1165: ! 1166: #define EFAB_SET_OWORD_FIELD_VER(efab, reg, field, val) \ ! 1167: if ( efab->pci_revision == FALCON_REV_B0 ) \ ! 1168: EFAB_SET_OWORD_FIELD ( reg, field ## _B0, val ); \ ! 1169: else \ ! 1170: EFAB_SET_OWORD_FIELD ( reg, field ## _A1, val ); ! 1171: ! 1172: #if FALCON_USE_IO_BAR ! 1173: ! 1174: /* Write dword via the I/O BAR */ ! 1175: static inline void _falcon_writel ( struct efab_nic *efab, uint32_t value, ! 1176: unsigned int reg ) { ! 1177: outl ( reg, efab->iobase + FCN_IOM_IND_ADR_REG ); ! 1178: outl ( value, efab->iobase + FCN_IOM_IND_DAT_REG ); ! 1179: } ! 1180: ! 1181: /* Read dword via the I/O BAR */ ! 1182: static inline uint32_t _falcon_readl ( struct efab_nic *efab, ! 1183: unsigned int reg ) { ! 1184: outl ( reg, efab->iobase + FCN_IOM_IND_ADR_REG ); ! 1185: return inl ( efab->iobase + FCN_IOM_IND_DAT_REG ); ! 1186: } ! 1187: ! 1188: #else /* FALCON_USE_IO_BAR */ ! 1189: ! 1190: #define _falcon_writel( efab, value, reg ) \ ! 1191: writel ( (value), (efab)->membase + (reg) ) ! 1192: #define _falcon_readl( efab, reg ) readl ( (efab)->membase + (reg) ) ! 1193: ! 1194: #endif /* FALCON_USE_IO_BAR */ ! 1195: ! 1196: /** ! 1197: * Write to a Falcon register ! 1198: * ! 1199: */ ! 1200: static inline void ! 1201: falcon_write ( struct efab_nic *efab, efab_oword_t *value, unsigned int reg ) ! 1202: { ! 1203: ! 1204: EFAB_REGDUMP ( "Writing register %x with " EFAB_OWORD_FMT "\n", ! 1205: reg, EFAB_OWORD_VAL ( *value ) ); ! 1206: ! 1207: _falcon_writel ( efab, value->u32[0], reg + 0 ); ! 1208: _falcon_writel ( efab, value->u32[1], reg + 4 ); ! 1209: _falcon_writel ( efab, value->u32[2], reg + 8 ); ! 1210: wmb(); ! 1211: _falcon_writel ( efab, value->u32[3], reg + 12 ); ! 1212: wmb(); ! 1213: } ! 1214: ! 1215: /** ! 1216: * Write to Falcon SRAM ! 1217: * ! 1218: */ ! 1219: static inline void ! 1220: falcon_write_sram ( struct efab_nic *efab, efab_qword_t *value, ! 1221: unsigned int index ) ! 1222: { ! 1223: unsigned int reg = ( FCN_REVISION_REG ( efab, FCN_BUF_FULL_TBL_KER ) + ! 1224: ( index * sizeof ( *value ) ) ); ! 1225: ! 1226: EFAB_REGDUMP ( "Writing SRAM register %x with " EFAB_QWORD_FMT "\n", ! 1227: reg, EFAB_QWORD_VAL ( *value ) ); ! 1228: ! 1229: _falcon_writel ( efab, value->u32[0], reg + 0 ); ! 1230: _falcon_writel ( efab, value->u32[1], reg + 4 ); ! 1231: wmb(); ! 1232: } ! 1233: ! 1234: /** ! 1235: * Write dword to Falcon register that allows partial writes ! 1236: * ! 1237: */ ! 1238: static inline void ! 1239: falcon_writel ( struct efab_nic *efab, efab_dword_t *value, unsigned int reg ) ! 1240: { ! 1241: EFAB_REGDUMP ( "Writing partial register %x with " EFAB_DWORD_FMT "\n", ! 1242: reg, EFAB_DWORD_VAL ( *value ) ); ! 1243: _falcon_writel ( efab, value->u32[0], reg ); ! 1244: } ! 1245: ! 1246: /** ! 1247: * Read from a Falcon register ! 1248: * ! 1249: */ ! 1250: static inline void ! 1251: falcon_read ( struct efab_nic *efab, efab_oword_t *value, unsigned int reg ) ! 1252: { ! 1253: value->u32[0] = _falcon_readl ( efab, reg + 0 ); ! 1254: wmb(); ! 1255: value->u32[1] = _falcon_readl ( efab, reg + 4 ); ! 1256: value->u32[2] = _falcon_readl ( efab, reg + 8 ); ! 1257: value->u32[3] = _falcon_readl ( efab, reg + 12 ); ! 1258: ! 1259: EFAB_REGDUMP ( "Read from register %x, got " EFAB_OWORD_FMT "\n", ! 1260: reg, EFAB_OWORD_VAL ( *value ) ); ! 1261: } ! 1262: ! 1263: /** ! 1264: * Read from Falcon SRAM ! 1265: * ! 1266: */ ! 1267: static inline void ! 1268: falcon_read_sram ( struct efab_nic *efab, efab_qword_t *value, ! 1269: unsigned int index ) ! 1270: { ! 1271: unsigned int reg = ( FCN_REVISION_REG ( efab, FCN_BUF_FULL_TBL_KER ) + ! 1272: ( index * sizeof ( *value ) ) ); ! 1273: ! 1274: value->u32[0] = _falcon_readl ( efab, reg + 0 ); ! 1275: value->u32[1] = _falcon_readl ( efab, reg + 4 ); ! 1276: EFAB_REGDUMP ( "Read from SRAM register %x, got " EFAB_QWORD_FMT "\n", ! 1277: reg, EFAB_QWORD_VAL ( *value ) ); ! 1278: } ! 1279: ! 1280: /** ! 1281: * Read dword from a portion of a Falcon register ! 1282: * ! 1283: */ ! 1284: static inline void ! 1285: falcon_readl ( struct efab_nic *efab, efab_dword_t *value, unsigned int reg ) ! 1286: { ! 1287: value->u32[0] = _falcon_readl ( efab, reg ); ! 1288: EFAB_REGDUMP ( "Read from register %x, got " EFAB_DWORD_FMT "\n", ! 1289: reg, EFAB_DWORD_VAL ( *value ) ); ! 1290: } ! 1291: ! 1292: #define FCN_DUMP_REG( efab, _reg ) do { \ ! 1293: efab_oword_t reg; \ ! 1294: falcon_read ( efab, ®, _reg ); \ ! 1295: EFAB_LOG ( #_reg " = " EFAB_OWORD_FMT "\n", \ ! 1296: EFAB_OWORD_VAL ( reg ) ); \ ! 1297: } while ( 0 ); ! 1298: ! 1299: #define FCN_DUMP_MAC_REG( efab, _mac_reg ) do { \ ! 1300: efab_dword_t reg; \ ! 1301: efab->mac_op->mac_readl ( efab, ®, _mac_reg ); \ ! 1302: EFAB_LOG ( #_mac_reg " = " EFAB_DWORD_FMT "\n", \ ! 1303: EFAB_DWORD_VAL ( reg ) ); \ ! 1304: } while ( 0 ); ! 1305: ! 1306: /** ! 1307: * See if an event is present ! 1308: * ! 1309: * @v event Falcon event structure ! 1310: * @ret True An event is pending ! 1311: * @ret False No event is pending ! 1312: * ! 1313: * We check both the high and low dword of the event for all ones. We ! 1314: * wrote all ones when we cleared the event, and no valid event can ! 1315: * have all ones in either its high or low dwords. This approach is ! 1316: * robust against reordering. ! 1317: * ! 1318: * Note that using a single 64-bit comparison is incorrect; even ! 1319: * though the CPU read will be atomic, the DMA write may not be. ! 1320: */ ! 1321: static inline int ! 1322: falcon_event_present ( falcon_event_t* event ) ! 1323: { ! 1324: return ( ! ( EFAB_DWORD_IS_ALL_ONES ( event->dword[0] ) | ! 1325: EFAB_DWORD_IS_ALL_ONES ( event->dword[1] ) ) ); ! 1326: } ! 1327: ! 1328: static void ! 1329: falcon_eventq_read_ack ( struct efab_nic *efab, struct efab_ev_queue *ev_queue ) ! 1330: { ! 1331: efab_dword_t reg; ! 1332: ! 1333: EFAB_POPULATE_DWORD_1 ( reg, FCN_EVQ_RPTR_DWORD, ev_queue->read_ptr ); ! 1334: falcon_writel ( efab, ®, ! 1335: FCN_REVISION_REG ( efab, FCN_EVQ_RPTR_REG_KER_DWORD ) ); ! 1336: } ! 1337: ! 1338: #if 0 ! 1339: /** ! 1340: * Dump register contents (for debugging) ! 1341: * ! 1342: * Marked as static inline so that it will not be compiled in if not ! 1343: * used. ! 1344: */ ! 1345: static inline void ! 1346: falcon_dump_regs ( struct efab_nic *efab ) ! 1347: { ! 1348: FCN_DUMP_REG ( efab, FCN_INT_EN_REG_KER ); ! 1349: FCN_DUMP_REG ( efab, FCN_INT_ADR_REG_KER ); ! 1350: FCN_DUMP_REG ( efab, FCN_GLB_CTL_REG_KER ); ! 1351: FCN_DUMP_REG ( efab, FCN_TIMER_CMD_REG_KER ); ! 1352: FCN_DUMP_REG ( efab, FCN_SRM_RX_DC_CFG_REG_KER ); ! 1353: FCN_DUMP_REG ( efab, FCN_SRM_TX_DC_CFG_REG_KER ); ! 1354: FCN_DUMP_REG ( efab, FCN_RX_FILTER_CTL_REG_KER ); ! 1355: FCN_DUMP_REG ( efab, FCN_RX_DC_CFG_REG_KER ); ! 1356: FCN_DUMP_REG ( efab, FCN_TX_DC_CFG_REG_KER ); ! 1357: FCN_DUMP_REG ( efab, FCN_MAC0_CTRL_REG_KER ); ! 1358: FCN_DUMP_REG ( efab, FCN_MAC1_CTRL_REG_KER ); ! 1359: FCN_DUMP_REG ( efab, FCN_REVISION_REG ( efab, FCN_RX_DESC_PTR_TBL_KER ) ); ! 1360: FCN_DUMP_REG ( efab, FCN_REVISION_REG ( efab, FCN_TX_DESC_PTR_TBL_KER ) ); ! 1361: FCN_DUMP_REG ( efab, FCN_REVISION_REG ( efab, FCN_EVQ_PTR_TBL_KER ) ); ! 1362: FCN_DUMP_MAC_REG ( efab, GM_CFG1_REG_MAC ); ! 1363: FCN_DUMP_MAC_REG ( efab, GM_CFG2_REG_MAC ); ! 1364: FCN_DUMP_MAC_REG ( efab, GM_MAX_FLEN_REG_MAC ); ! 1365: FCN_DUMP_MAC_REG ( efab, GM_MII_MGMT_CFG_REG_MAC ); ! 1366: FCN_DUMP_MAC_REG ( efab, GM_ADR1_REG_MAC ); ! 1367: FCN_DUMP_MAC_REG ( efab, GM_ADR2_REG_MAC ); ! 1368: FCN_DUMP_MAC_REG ( efab, GMF_CFG0_REG_MAC ); ! 1369: FCN_DUMP_MAC_REG ( efab, GMF_CFG1_REG_MAC ); ! 1370: FCN_DUMP_MAC_REG ( efab, GMF_CFG2_REG_MAC ); ! 1371: FCN_DUMP_MAC_REG ( efab, GMF_CFG3_REG_MAC ); ! 1372: FCN_DUMP_MAC_REG ( efab, GMF_CFG4_REG_MAC ); ! 1373: FCN_DUMP_MAC_REG ( efab, GMF_CFG5_REG_MAC ); ! 1374: } ! 1375: #endif ! 1376: ! 1377: static void ! 1378: falcon_interrupts ( struct efab_nic *efab, int enabled, int force ) ! 1379: { ! 1380: efab_oword_t int_en_reg_ker; ! 1381: ! 1382: EFAB_POPULATE_OWORD_2 ( int_en_reg_ker, ! 1383: FCN_KER_INT_KER, force, ! 1384: FCN_DRV_INT_EN_KER, enabled ); ! 1385: falcon_write ( efab, &int_en_reg_ker, FCN_INT_EN_REG_KER ); ! 1386: } ! 1387: ! 1388: /******************************************************************************* ! 1389: * ! 1390: * ! 1391: * SPI access ! 1392: * ! 1393: * ! 1394: *******************************************************************************/ ! 1395: ! 1396: ! 1397: /** Maximum length for a single SPI transaction */ ! 1398: #define FALCON_SPI_MAX_LEN 16 ! 1399: ! 1400: static int ! 1401: falcon_spi_wait ( struct efab_nic *efab ) ! 1402: { ! 1403: efab_oword_t reg; ! 1404: int count; ! 1405: ! 1406: count = 0; ! 1407: do { ! 1408: udelay ( 100 ); ! 1409: falcon_read ( efab, ®, FCN_EE_SPI_HCMD_REG ); ! 1410: if ( EFAB_OWORD_FIELD ( reg, FCN_EE_SPI_HCMD_CMD_EN ) == 0 ) ! 1411: return 0; ! 1412: } while ( ++count < 1000 ); ! 1413: ! 1414: EFAB_ERR ( "Timed out waiting for SPI\n" ); ! 1415: return -ETIMEDOUT; ! 1416: } ! 1417: ! 1418: static int ! 1419: falcon_spi_rw ( struct spi_bus* bus, struct spi_device *device, ! 1420: unsigned int command, int address, ! 1421: const void* data_out, void *data_in, size_t len ) ! 1422: { ! 1423: struct efab_nic *efab = container_of ( bus, struct efab_nic, spi_bus ); ! 1424: int address_len, rc, device_id, read_cmd; ! 1425: efab_oword_t reg; ! 1426: ! 1427: /* falcon_init_spi_device() should have reduced the block size ! 1428: * down so this constraint holds */ ! 1429: assert ( len <= FALCON_SPI_MAX_LEN ); ! 1430: ! 1431: /* Is this the FLASH or EEPROM device? */ ! 1432: if ( device == &efab->spi_flash ) ! 1433: device_id = FCN_EE_SPI_FLASH; ! 1434: else if ( device == &efab->spi_eeprom ) ! 1435: device_id = FCN_EE_SPI_EEPROM; ! 1436: else { ! 1437: EFAB_ERR ( "Unknown device %p\n", device ); ! 1438: return -EINVAL; ! 1439: } ! 1440: ! 1441: EFAB_TRACE ( "Executing spi command %d on device %d at %d for %zd bytes\n", ! 1442: command, device_id, address, len ); ! 1443: ! 1444: /* The bus must be idle */ ! 1445: rc = falcon_spi_wait ( efab ); ! 1446: if ( rc ) ! 1447: goto fail1; ! 1448: ! 1449: /* Copy data out */ ! 1450: if ( data_out ) { ! 1451: memcpy ( ®, data_out, len ); ! 1452: falcon_write ( efab, ®, FCN_EE_SPI_HDATA_REG ); ! 1453: } ! 1454: ! 1455: /* Program address register */ ! 1456: if ( address >= 0 ) { ! 1457: EFAB_POPULATE_OWORD_1 ( reg, FCN_EE_SPI_HADR_ADR, address ); ! 1458: falcon_write ( efab, ®, FCN_EE_SPI_HADR_REG ); ! 1459: } ! 1460: ! 1461: /* Issue command */ ! 1462: address_len = ( address >= 0 ) ? device->address_len / 8 : 0; ! 1463: read_cmd = ( data_in ? FCN_EE_SPI_READ : FCN_EE_SPI_WRITE ); ! 1464: EFAB_POPULATE_OWORD_7 ( reg, ! 1465: FCN_EE_SPI_HCMD_CMD_EN, 1, ! 1466: FCN_EE_SPI_HCMD_SF_SEL, device_id, ! 1467: FCN_EE_SPI_HCMD_DABCNT, len, ! 1468: FCN_EE_SPI_HCMD_READ, read_cmd, ! 1469: FCN_EE_SPI_HCMD_DUBCNT, 0, ! 1470: FCN_EE_SPI_HCMD_ADBCNT, address_len, ! 1471: FCN_EE_SPI_HCMD_ENC, command ); ! 1472: falcon_write ( efab, ®, FCN_EE_SPI_HCMD_REG ); ! 1473: ! 1474: /* Wait for the command to complete */ ! 1475: rc = falcon_spi_wait ( efab ); ! 1476: if ( rc ) ! 1477: goto fail2; ! 1478: ! 1479: /* Copy data in */ ! 1480: if ( data_in ) { ! 1481: falcon_read ( efab, ®, FCN_EE_SPI_HDATA_REG ); ! 1482: memcpy ( data_in, ®, len ); ! 1483: } ! 1484: ! 1485: return 0; ! 1486: ! 1487: fail2: ! 1488: fail1: ! 1489: EFAB_ERR ( "Failed SPI command %d to device %d address 0x%x len 0x%zx\n", ! 1490: command, device_id, address, len ); ! 1491: ! 1492: return rc; ! 1493: } ! 1494: ! 1495: /******************************************************************************* ! 1496: * ! 1497: * ! 1498: * Falcon bit-bashed I2C interface ! 1499: * ! 1500: * ! 1501: *******************************************************************************/ ! 1502: ! 1503: static void ! 1504: falcon_i2c_bit_write ( struct bit_basher *basher, unsigned int bit_id, ! 1505: unsigned long data ) ! 1506: { ! 1507: struct efab_nic *efab = container_of ( basher, struct efab_nic, ! 1508: i2c_bb.basher ); ! 1509: efab_oword_t reg; ! 1510: ! 1511: falcon_read ( efab, ®, FCN_GPIO_CTL_REG_KER ); ! 1512: switch ( bit_id ) { ! 1513: case I2C_BIT_SCL: ! 1514: EFAB_SET_OWORD_FIELD ( reg, FCN_GPIO0_OEN, ( data ? 0 : 1 ) ); ! 1515: break; ! 1516: case I2C_BIT_SDA: ! 1517: EFAB_SET_OWORD_FIELD ( reg, FCN_GPIO3_OEN, ( data ? 0 : 1 ) ); ! 1518: break; ! 1519: default: ! 1520: EFAB_ERR ( "%s bit=%d\n", __func__, bit_id ); ! 1521: break; ! 1522: } ! 1523: ! 1524: falcon_write ( efab, ®, FCN_GPIO_CTL_REG_KER ); ! 1525: } ! 1526: ! 1527: static int ! 1528: falcon_i2c_bit_read ( struct bit_basher *basher, unsigned int bit_id ) ! 1529: { ! 1530: struct efab_nic *efab = container_of ( basher, struct efab_nic, ! 1531: i2c_bb.basher ); ! 1532: efab_oword_t reg; ! 1533: ! 1534: falcon_read ( efab, ®, FCN_GPIO_CTL_REG_KER ); ! 1535: switch ( bit_id ) { ! 1536: case I2C_BIT_SCL: ! 1537: return EFAB_OWORD_FIELD ( reg, FCN_GPIO0_IN ); ! 1538: break; ! 1539: case I2C_BIT_SDA: ! 1540: return EFAB_OWORD_FIELD ( reg, FCN_GPIO3_IN ); ! 1541: break; ! 1542: default: ! 1543: EFAB_ERR ( "%s bit=%d\n", __func__, bit_id ); ! 1544: break; ! 1545: } ! 1546: ! 1547: return -1; ! 1548: } ! 1549: ! 1550: static struct bit_basher_operations falcon_i2c_bit_ops = { ! 1551: .read = falcon_i2c_bit_read, ! 1552: .write = falcon_i2c_bit_write, ! 1553: }; ! 1554: ! 1555: ! 1556: /******************************************************************************* ! 1557: * ! 1558: * ! 1559: * MDIO access ! 1560: * ! 1561: * ! 1562: *******************************************************************************/ ! 1563: ! 1564: static int ! 1565: falcon_gmii_wait ( struct efab_nic *efab ) ! 1566: { ! 1567: efab_dword_t md_stat; ! 1568: int count; ! 1569: ! 1570: /* wait upto 10ms */ ! 1571: for (count = 0; count < 1000; count++) { ! 1572: falcon_readl ( efab, &md_stat, FCN_MD_STAT_REG_KER ); ! 1573: if ( EFAB_DWORD_FIELD ( md_stat, FCN_MD_BSY ) == 0 ) { ! 1574: if ( EFAB_DWORD_FIELD ( md_stat, FCN_MD_LNFL ) != 0 || ! 1575: EFAB_DWORD_FIELD ( md_stat, FCN_MD_BSERR ) != 0 ) { ! 1576: EFAB_ERR ( "Error from GMII access " ! 1577: EFAB_DWORD_FMT"\n", ! 1578: EFAB_DWORD_VAL ( md_stat )); ! 1579: return -EIO; ! 1580: } ! 1581: return 0; ! 1582: } ! 1583: udelay(10); ! 1584: } ! 1585: ! 1586: EFAB_ERR ( "Timed out waiting for GMII\n" ); ! 1587: return -ETIMEDOUT; ! 1588: } ! 1589: ! 1590: static void ! 1591: falcon_mdio_write ( struct efab_nic *efab, int device, ! 1592: int location, int value ) ! 1593: { ! 1594: efab_oword_t reg; ! 1595: ! 1596: EFAB_TRACE ( "Writing GMII %d register %02x with %04x\n", ! 1597: device, location, value ); ! 1598: ! 1599: /* Check MII not currently being accessed */ ! 1600: if ( falcon_gmii_wait ( efab ) ) ! 1601: return; ! 1602: ! 1603: /* Write the address/ID register */ ! 1604: EFAB_POPULATE_OWORD_1 ( reg, FCN_MD_PHY_ADR, location ); ! 1605: falcon_write ( efab, ®, FCN_MD_PHY_ADR_REG_KER ); ! 1606: ! 1607: if ( efab->phy_10g ) { ! 1608: /* clause45 */ ! 1609: EFAB_POPULATE_OWORD_2 ( reg, ! 1610: FCN_MD_PRT_ADR, efab->phy_addr, ! 1611: FCN_MD_DEV_ADR, device ); ! 1612: } ! 1613: else { ! 1614: /* clause22 */ ! 1615: assert ( device == 0 ); ! 1616: ! 1617: EFAB_POPULATE_OWORD_2 ( reg, ! 1618: FCN_MD_PRT_ADR, efab->phy_addr, ! 1619: FCN_MD_DEV_ADR, location ); ! 1620: } ! 1621: falcon_write ( efab, ®, FCN_MD_ID_REG_KER ); ! 1622: ! 1623: ! 1624: /* Write data */ ! 1625: EFAB_POPULATE_OWORD_1 ( reg, FCN_MD_TXD, value ); ! 1626: falcon_write ( efab, ®, FCN_MD_TXD_REG_KER ); ! 1627: ! 1628: EFAB_POPULATE_OWORD_2 ( reg, ! 1629: FCN_MD_WRC, 1, ! 1630: FCN_MD_GC, ( efab->phy_10g ? 0 : 1 ) ); ! 1631: falcon_write ( efab, ®, FCN_MD_CS_REG_KER ); ! 1632: ! 1633: /* Wait for data to be written */ ! 1634: if ( falcon_gmii_wait ( efab ) ) { ! 1635: /* Abort the write operation */ ! 1636: EFAB_POPULATE_OWORD_2 ( reg, ! 1637: FCN_MD_WRC, 0, ! 1638: FCN_MD_GC, 1); ! 1639: falcon_write ( efab, ®, FCN_MD_CS_REG_KER ); ! 1640: udelay(10); ! 1641: } ! 1642: } ! 1643: ! 1644: static int ! 1645: falcon_mdio_read ( struct efab_nic *efab, int device, int location ) ! 1646: { ! 1647: efab_oword_t reg; ! 1648: int value; ! 1649: ! 1650: /* Check MII not currently being accessed */ ! 1651: if ( falcon_gmii_wait ( efab ) ) ! 1652: return -1; ! 1653: ! 1654: if ( efab->phy_10g ) { ! 1655: /* clause45 */ ! 1656: EFAB_POPULATE_OWORD_1 ( reg, FCN_MD_PHY_ADR, location ); ! 1657: falcon_write ( efab, ®, FCN_MD_PHY_ADR_REG_KER ); ! 1658: ! 1659: EFAB_POPULATE_OWORD_2 ( reg, ! 1660: FCN_MD_PRT_ADR, efab->phy_addr, ! 1661: FCN_MD_DEV_ADR, device ); ! 1662: falcon_write ( efab, ®, FCN_MD_ID_REG_KER); ! 1663: ! 1664: /* request data to be read */ ! 1665: EFAB_POPULATE_OWORD_2 ( reg, ! 1666: FCN_MD_RDC, 1, ! 1667: FCN_MD_GC, 0 ); ! 1668: } ! 1669: else { ! 1670: /* clause22 */ ! 1671: assert ( device == 0 ); ! 1672: ! 1673: EFAB_POPULATE_OWORD_2 ( reg, ! 1674: FCN_MD_PRT_ADR, efab->phy_addr, ! 1675: FCN_MD_DEV_ADR, location ); ! 1676: falcon_write ( efab, ®, FCN_MD_ID_REG_KER ); ! 1677: ! 1678: /* Request data to be read */ ! 1679: EFAB_POPULATE_OWORD_2 ( reg, ! 1680: FCN_MD_RIC, 1, ! 1681: FCN_MD_GC, 1 ); ! 1682: } ! 1683: ! 1684: falcon_write ( efab, ®, FCN_MD_CS_REG_KER ); ! 1685: ! 1686: /* Wait for data to become available */ ! 1687: if ( falcon_gmii_wait ( efab ) ) { ! 1688: /* Abort the read operation */ ! 1689: EFAB_POPULATE_OWORD_2 ( reg, ! 1690: FCN_MD_RIC, 0, ! 1691: FCN_MD_GC, 1 ); ! 1692: falcon_write ( efab, ®, FCN_MD_CS_REG_KER ); ! 1693: udelay ( 10 ); ! 1694: value = -1; ! 1695: } ! 1696: else { ! 1697: /* Read the data */ ! 1698: falcon_read ( efab, ®, FCN_MD_RXD_REG_KER ); ! 1699: value = EFAB_OWORD_FIELD ( reg, FCN_MD_RXD ); ! 1700: } ! 1701: ! 1702: EFAB_TRACE ( "Read from GMII %d register %02x, got %04x\n", ! 1703: device, location, value ); ! 1704: ! 1705: return value; ! 1706: } ! 1707: ! 1708: /******************************************************************************* ! 1709: * ! 1710: * ! 1711: * MAC wrapper ! 1712: * ! 1713: * ! 1714: *******************************************************************************/ ! 1715: ! 1716: static void ! 1717: falcon_reconfigure_mac_wrapper ( struct efab_nic *efab ) ! 1718: { ! 1719: efab_oword_t reg; ! 1720: int link_speed; ! 1721: ! 1722: if ( efab->link_options & LPA_EF_10000 ) { ! 1723: link_speed = 0x3; ! 1724: } else if ( efab->link_options & LPA_EF_1000 ) { ! 1725: link_speed = 0x2; ! 1726: } else if ( efab->link_options & LPA_100 ) { ! 1727: link_speed = 0x1; ! 1728: } else { ! 1729: link_speed = 0x0; ! 1730: } ! 1731: EFAB_POPULATE_OWORD_5 ( reg, ! 1732: FCN_MAC_XOFF_VAL, 0xffff /* datasheet */, ! 1733: FCN_MAC_BCAD_ACPT, 1, ! 1734: FCN_MAC_UC_PROM, 0, ! 1735: FCN_MAC_LINK_STATUS, 1, ! 1736: FCN_MAC_SPEED, link_speed ); ! 1737: ! 1738: falcon_write ( efab, ®, FCN_MAC0_CTRL_REG_KER ); ! 1739: } ! 1740: ! 1741: /******************************************************************************* ! 1742: * ! 1743: * ! 1744: * GMAC handling ! 1745: * ! 1746: * ! 1747: *******************************************************************************/ ! 1748: ! 1749: /* GMAC configuration register 1 */ ! 1750: #define GM_CFG1_REG_MAC 0x00 ! 1751: #define GM_SW_RST_LBN 31 ! 1752: #define GM_SW_RST_WIDTH 1 ! 1753: #define GM_RX_FC_EN_LBN 5 ! 1754: #define GM_RX_FC_EN_WIDTH 1 ! 1755: #define GM_TX_FC_EN_LBN 4 ! 1756: #define GM_TX_FC_EN_WIDTH 1 ! 1757: #define GM_RX_EN_LBN 2 ! 1758: #define GM_RX_EN_WIDTH 1 ! 1759: #define GM_TX_EN_LBN 0 ! 1760: #define GM_TX_EN_WIDTH 1 ! 1761: ! 1762: /* GMAC configuration register 2 */ ! 1763: #define GM_CFG2_REG_MAC 0x01 ! 1764: #define GM_PAMBL_LEN_LBN 12 ! 1765: #define GM_PAMBL_LEN_WIDTH 4 ! 1766: #define GM_IF_MODE_LBN 8 ! 1767: #define GM_IF_MODE_WIDTH 2 ! 1768: #define GM_PAD_CRC_EN_LBN 2 ! 1769: #define GM_PAD_CRC_EN_WIDTH 1 ! 1770: #define GM_FD_LBN 0 ! 1771: #define GM_FD_WIDTH 1 ! 1772: ! 1773: /* GMAC maximum frame length register */ ! 1774: #define GM_MAX_FLEN_REG_MAC 0x04 ! 1775: #define GM_MAX_FLEN_LBN 0 ! 1776: #define GM_MAX_FLEN_WIDTH 16 ! 1777: ! 1778: /* GMAC MII management configuration register */ ! 1779: #define GM_MII_MGMT_CFG_REG_MAC 0x08 ! 1780: #define GM_MGMT_CLK_SEL_LBN 0 ! 1781: #define GM_MGMT_CLK_SEL_WIDTH 3 ! 1782: ! 1783: /* GMAC MII management command register */ ! 1784: #define GM_MII_MGMT_CMD_REG_MAC 0x09 ! 1785: #define GM_MGMT_SCAN_CYC_LBN 1 ! 1786: #define GM_MGMT_SCAN_CYC_WIDTH 1 ! 1787: #define GM_MGMT_RD_CYC_LBN 0 ! 1788: #define GM_MGMT_RD_CYC_WIDTH 1 ! 1789: ! 1790: /* GMAC MII management address register */ ! 1791: #define GM_MII_MGMT_ADR_REG_MAC 0x0a ! 1792: #define GM_MGMT_PHY_ADDR_LBN 8 ! 1793: #define GM_MGMT_PHY_ADDR_WIDTH 5 ! 1794: #define GM_MGMT_REG_ADDR_LBN 0 ! 1795: #define GM_MGMT_REG_ADDR_WIDTH 5 ! 1796: ! 1797: /* GMAC MII management control register */ ! 1798: #define GM_MII_MGMT_CTL_REG_MAC 0x0b ! 1799: #define GM_MGMT_CTL_LBN 0 ! 1800: #define GM_MGMT_CTL_WIDTH 16 ! 1801: ! 1802: /* GMAC MII management status register */ ! 1803: #define GM_MII_MGMT_STAT_REG_MAC 0x0c ! 1804: #define GM_MGMT_STAT_LBN 0 ! 1805: #define GM_MGMT_STAT_WIDTH 16 ! 1806: ! 1807: /* GMAC MII management indicators register */ ! 1808: #define GM_MII_MGMT_IND_REG_MAC 0x0d ! 1809: #define GM_MGMT_BUSY_LBN 0 ! 1810: #define GM_MGMT_BUSY_WIDTH 1 ! 1811: ! 1812: /* GMAC station address register 1 */ ! 1813: #define GM_ADR1_REG_MAC 0x10 ! 1814: #define GM_HWADDR_5_LBN 24 ! 1815: #define GM_HWADDR_5_WIDTH 8 ! 1816: #define GM_HWADDR_4_LBN 16 ! 1817: #define GM_HWADDR_4_WIDTH 8 ! 1818: #define GM_HWADDR_3_LBN 8 ! 1819: #define GM_HWADDR_3_WIDTH 8 ! 1820: #define GM_HWADDR_2_LBN 0 ! 1821: #define GM_HWADDR_2_WIDTH 8 ! 1822: ! 1823: /* GMAC station address register 2 */ ! 1824: #define GM_ADR2_REG_MAC 0x11 ! 1825: #define GM_HWADDR_1_LBN 24 ! 1826: #define GM_HWADDR_1_WIDTH 8 ! 1827: #define GM_HWADDR_0_LBN 16 ! 1828: #define GM_HWADDR_0_WIDTH 8 ! 1829: ! 1830: /* GMAC FIFO configuration register 0 */ ! 1831: #define GMF_CFG0_REG_MAC 0x12 ! 1832: #define GMF_FTFENREQ_LBN 12 ! 1833: #define GMF_FTFENREQ_WIDTH 1 ! 1834: #define GMF_STFENREQ_LBN 11 ! 1835: #define GMF_STFENREQ_WIDTH 1 ! 1836: #define GMF_FRFENREQ_LBN 10 ! 1837: #define GMF_FRFENREQ_WIDTH 1 ! 1838: #define GMF_SRFENREQ_LBN 9 ! 1839: #define GMF_SRFENREQ_WIDTH 1 ! 1840: #define GMF_WTMENREQ_LBN 8 ! 1841: #define GMF_WTMENREQ_WIDTH 1 ! 1842: ! 1843: /* GMAC FIFO configuration register 1 */ ! 1844: #define GMF_CFG1_REG_MAC 0x13 ! 1845: #define GMF_CFGFRTH_LBN 16 ! 1846: #define GMF_CFGFRTH_WIDTH 5 ! 1847: #define GMF_CFGXOFFRTX_LBN 0 ! 1848: #define GMF_CFGXOFFRTX_WIDTH 16 ! 1849: ! 1850: /* GMAC FIFO configuration register 2 */ ! 1851: #define GMF_CFG2_REG_MAC 0x14 ! 1852: #define GMF_CFGHWM_LBN 16 ! 1853: #define GMF_CFGHWM_WIDTH 6 ! 1854: #define GMF_CFGLWM_LBN 0 ! 1855: #define GMF_CFGLWM_WIDTH 6 ! 1856: ! 1857: /* GMAC FIFO configuration register 3 */ ! 1858: #define GMF_CFG3_REG_MAC 0x15 ! 1859: #define GMF_CFGHWMFT_LBN 16 ! 1860: #define GMF_CFGHWMFT_WIDTH 6 ! 1861: #define GMF_CFGFTTH_LBN 0 ! 1862: #define GMF_CFGFTTH_WIDTH 6 ! 1863: ! 1864: /* GMAC FIFO configuration register 4 */ ! 1865: #define GMF_CFG4_REG_MAC 0x16 ! 1866: #define GMF_HSTFLTRFRM_PAUSE_LBN 12 ! 1867: #define GMF_HSTFLTRFRM_PAUSE_WIDTH 12 ! 1868: ! 1869: /* GMAC FIFO configuration register 5 */ ! 1870: #define GMF_CFG5_REG_MAC 0x17 ! 1871: #define GMF_CFGHDPLX_LBN 22 ! 1872: #define GMF_CFGHDPLX_WIDTH 1 ! 1873: #define GMF_CFGBYTMODE_LBN 19 ! 1874: #define GMF_CFGBYTMODE_WIDTH 1 ! 1875: #define GMF_HSTDRPLT64_LBN 18 ! 1876: #define GMF_HSTDRPLT64_WIDTH 1 ! 1877: #define GMF_HSTFLTRFRMDC_PAUSE_LBN 12 ! 1878: #define GMF_HSTFLTRFRMDC_PAUSE_WIDTH 1 ! 1879: ! 1880: static void ! 1881: falcon_gmac_writel ( struct efab_nic *efab, efab_dword_t *value, ! 1882: unsigned int mac_reg ) ! 1883: { ! 1884: efab_oword_t temp; ! 1885: ! 1886: EFAB_POPULATE_OWORD_1 ( temp, FCN_MAC_DATA, ! 1887: EFAB_DWORD_FIELD ( *value, FCN_MAC_DATA ) ); ! 1888: falcon_write ( efab, &temp, FALCON_GMAC_REG ( efab, mac_reg ) ); ! 1889: } ! 1890: ! 1891: static void ! 1892: falcon_gmac_readl ( struct efab_nic *efab, efab_dword_t *value, ! 1893: unsigned int mac_reg ) ! 1894: { ! 1895: efab_oword_t temp; ! 1896: ! 1897: falcon_read ( efab, &temp, FALCON_GMAC_REG ( efab, mac_reg ) ); ! 1898: EFAB_POPULATE_DWORD_1 ( *value, FCN_MAC_DATA, ! 1899: EFAB_OWORD_FIELD ( temp, FCN_MAC_DATA ) ); ! 1900: } ! 1901: ! 1902: static void ! 1903: mentormac_reset ( struct efab_nic *efab ) ! 1904: { ! 1905: efab_dword_t reg; ! 1906: ! 1907: /* Take into reset */ ! 1908: EFAB_POPULATE_DWORD_1 ( reg, GM_SW_RST, 1 ); ! 1909: falcon_gmac_writel ( efab, ®, GM_CFG1_REG_MAC ); ! 1910: udelay ( 1000 ); ! 1911: ! 1912: /* Take out of reset */ ! 1913: EFAB_POPULATE_DWORD_1 ( reg, GM_SW_RST, 0 ); ! 1914: falcon_gmac_writel ( efab, ®, GM_CFG1_REG_MAC ); ! 1915: udelay ( 1000 ); ! 1916: ! 1917: /* Configure GMII interface so PHY is accessible. Note that ! 1918: * GMII interface is connected only to port 0, and that on ! 1919: * Falcon this is a no-op. ! 1920: */ ! 1921: EFAB_POPULATE_DWORD_1 ( reg, GM_MGMT_CLK_SEL, 0x4 ); ! 1922: falcon_gmac_writel ( efab, ®, GM_MII_MGMT_CFG_REG_MAC ); ! 1923: udelay ( 10 ); ! 1924: } ! 1925: ! 1926: static void ! 1927: mentormac_init ( struct efab_nic *efab ) ! 1928: { ! 1929: int pause, if_mode, full_duplex, bytemode, half_duplex; ! 1930: efab_dword_t reg; ! 1931: ! 1932: /* Configuration register 1 */ ! 1933: pause = ( efab->link_options & LPA_PAUSE_CAP ) ? 1 : 0; ! 1934: if ( ! ( efab->link_options & LPA_EF_DUPLEX ) ) { ! 1935: /* Half-duplex operation requires TX flow control */ ! 1936: pause = 1; ! 1937: } ! 1938: EFAB_POPULATE_DWORD_4 ( reg, ! 1939: GM_TX_EN, 1, ! 1940: GM_TX_FC_EN, pause, ! 1941: GM_RX_EN, 1, ! 1942: GM_RX_FC_EN, 1 ); ! 1943: falcon_gmac_writel ( efab, ®, GM_CFG1_REG_MAC ); ! 1944: udelay ( 10 ); ! 1945: ! 1946: /* Configuration register 2 */ ! 1947: if_mode = ( efab->link_options & LPA_EF_1000 ) ? 2 : 1; ! 1948: full_duplex = ( efab->link_options & LPA_EF_DUPLEX ) ? 1 : 0; ! 1949: EFAB_POPULATE_DWORD_4 ( reg, ! 1950: GM_IF_MODE, if_mode, ! 1951: GM_PAD_CRC_EN, 1, ! 1952: GM_FD, full_duplex, ! 1953: GM_PAMBL_LEN, 0x7 /* ? */ ); ! 1954: falcon_gmac_writel ( efab, ®, GM_CFG2_REG_MAC ); ! 1955: udelay ( 10 ); ! 1956: ! 1957: /* Max frame len register */ ! 1958: EFAB_POPULATE_DWORD_1 ( reg, GM_MAX_FLEN, ! 1959: EFAB_MAX_FRAME_LEN ( ETH_FRAME_LEN ) ); ! 1960: falcon_gmac_writel ( efab, ®, GM_MAX_FLEN_REG_MAC ); ! 1961: udelay ( 10 ); ! 1962: ! 1963: /* FIFO configuration register 0 */ ! 1964: EFAB_POPULATE_DWORD_5 ( reg, ! 1965: GMF_FTFENREQ, 1, ! 1966: GMF_STFENREQ, 1, ! 1967: GMF_FRFENREQ, 1, ! 1968: GMF_SRFENREQ, 1, ! 1969: GMF_WTMENREQ, 1 ); ! 1970: falcon_gmac_writel ( efab, ®, GMF_CFG0_REG_MAC ); ! 1971: udelay ( 10 ); ! 1972: ! 1973: /* FIFO configuration register 1 */ ! 1974: EFAB_POPULATE_DWORD_2 ( reg, ! 1975: GMF_CFGFRTH, 0x12, ! 1976: GMF_CFGXOFFRTX, 0xffff ); ! 1977: falcon_gmac_writel ( efab, ®, GMF_CFG1_REG_MAC ); ! 1978: udelay ( 10 ); ! 1979: ! 1980: /* FIFO configuration register 2 */ ! 1981: EFAB_POPULATE_DWORD_2 ( reg, ! 1982: GMF_CFGHWM, 0x3f, ! 1983: GMF_CFGLWM, 0xa ); ! 1984: falcon_gmac_writel ( efab, ®, GMF_CFG2_REG_MAC ); ! 1985: udelay ( 10 ); ! 1986: ! 1987: /* FIFO configuration register 3 */ ! 1988: EFAB_POPULATE_DWORD_2 ( reg, ! 1989: GMF_CFGHWMFT, 0x1c, ! 1990: GMF_CFGFTTH, 0x08 ); ! 1991: falcon_gmac_writel ( efab, ®, GMF_CFG3_REG_MAC ); ! 1992: udelay ( 10 ); ! 1993: ! 1994: /* FIFO configuration register 4 */ ! 1995: EFAB_POPULATE_DWORD_1 ( reg, GMF_HSTFLTRFRM_PAUSE, 1 ); ! 1996: falcon_gmac_writel ( efab, ®, GMF_CFG4_REG_MAC ); ! 1997: udelay ( 10 ); ! 1998: ! 1999: /* FIFO configuration register 5 */ ! 2000: bytemode = ( efab->link_options & LPA_EF_1000 ) ? 1 : 0; ! 2001: half_duplex = ( efab->link_options & LPA_EF_DUPLEX ) ? 0 : 1; ! 2002: falcon_gmac_readl ( efab, ®, GMF_CFG5_REG_MAC ); ! 2003: EFAB_SET_DWORD_FIELD ( reg, GMF_CFGBYTMODE, bytemode ); ! 2004: EFAB_SET_DWORD_FIELD ( reg, GMF_CFGHDPLX, half_duplex ); ! 2005: EFAB_SET_DWORD_FIELD ( reg, GMF_HSTDRPLT64, half_duplex ); ! 2006: EFAB_SET_DWORD_FIELD ( reg, GMF_HSTFLTRFRMDC_PAUSE, 0 ); ! 2007: falcon_gmac_writel ( efab, ®, GMF_CFG5_REG_MAC ); ! 2008: udelay ( 10 ); ! 2009: ! 2010: /* MAC address */ ! 2011: EFAB_POPULATE_DWORD_4 ( reg, ! 2012: GM_HWADDR_5, efab->mac_addr[5], ! 2013: GM_HWADDR_4, efab->mac_addr[4], ! 2014: GM_HWADDR_3, efab->mac_addr[3], ! 2015: GM_HWADDR_2, efab->mac_addr[2] ); ! 2016: falcon_gmac_writel ( efab, ®, GM_ADR1_REG_MAC ); ! 2017: udelay ( 10 ); ! 2018: EFAB_POPULATE_DWORD_2 ( reg, ! 2019: GM_HWADDR_1, efab->mac_addr[1], ! 2020: GM_HWADDR_0, efab->mac_addr[0] ); ! 2021: falcon_gmac_writel ( efab, ®, GM_ADR2_REG_MAC ); ! 2022: udelay ( 10 ); ! 2023: } ! 2024: ! 2025: static int ! 2026: falcon_init_gmac ( struct efab_nic *efab ) ! 2027: { ! 2028: /* Reset the MAC */ ! 2029: mentormac_reset ( efab ); ! 2030: ! 2031: /* Initialise PHY */ ! 2032: efab->phy_op->init ( efab ); ! 2033: ! 2034: /* check the link is up */ ! 2035: if ( !efab->link_up ) ! 2036: return -EAGAIN; ! 2037: ! 2038: /* Initialise MAC */ ! 2039: mentormac_init ( efab ); ! 2040: ! 2041: /* reconfigure the MAC wrapper */ ! 2042: falcon_reconfigure_mac_wrapper ( efab ); ! 2043: ! 2044: return 0; ! 2045: } ! 2046: ! 2047: static struct efab_mac_operations falcon_gmac_operations = { ! 2048: .init = falcon_init_gmac, ! 2049: }; ! 2050: ! 2051: ! 2052: /******************************************************************************* ! 2053: * ! 2054: * ! 2055: * XMAC handling ! 2056: * ! 2057: * ! 2058: *******************************************************************************/ ! 2059: ! 2060: /** ! 2061: * Write dword to a Falcon XMAC register ! 2062: * ! 2063: */ ! 2064: static void ! 2065: falcon_xmac_writel ( struct efab_nic *efab, efab_dword_t *value, ! 2066: unsigned int mac_reg ) ! 2067: { ! 2068: efab_oword_t temp; ! 2069: ! 2070: EFAB_POPULATE_OWORD_1 ( temp, FCN_MAC_DATA, ! 2071: EFAB_DWORD_FIELD ( *value, FCN_MAC_DATA ) ); ! 2072: falcon_write ( efab, &temp, ! 2073: FALCON_XMAC_REG ( efab, mac_reg ) ); ! 2074: } ! 2075: ! 2076: /** ! 2077: * Read dword from a Falcon XMAC register ! 2078: * ! 2079: */ ! 2080: static void ! 2081: falcon_xmac_readl ( struct efab_nic *efab, efab_dword_t *value, ! 2082: unsigned int mac_reg ) ! 2083: { ! 2084: efab_oword_t temp; ! 2085: ! 2086: falcon_read ( efab, &temp, ! 2087: FALCON_XMAC_REG ( efab, mac_reg ) ); ! 2088: EFAB_POPULATE_DWORD_1 ( *value, FCN_MAC_DATA, ! 2089: EFAB_OWORD_FIELD ( temp, FCN_MAC_DATA ) ); ! 2090: } ! 2091: ! 2092: /** ! 2093: * Configure Falcon XAUI output ! 2094: */ ! 2095: static void ! 2096: falcon_setup_xaui ( struct efab_nic *efab ) ! 2097: { ! 2098: efab_dword_t sdctl, txdrv; ! 2099: ! 2100: falcon_xmac_readl ( efab, &sdctl, FCN_XX_SD_CTL_REG_MAC ); ! 2101: EFAB_SET_DWORD_FIELD ( sdctl, FCN_XX_HIDRVD, XX_SD_CTL_DRV_DEFAULT ); ! 2102: EFAB_SET_DWORD_FIELD ( sdctl, FCN_XX_LODRVD, XX_SD_CTL_DRV_DEFAULT ); ! 2103: EFAB_SET_DWORD_FIELD ( sdctl, FCN_XX_HIDRVC, XX_SD_CTL_DRV_DEFAULT ); ! 2104: EFAB_SET_DWORD_FIELD ( sdctl, FCN_XX_LODRVC, XX_SD_CTL_DRV_DEFAULT ); ! 2105: EFAB_SET_DWORD_FIELD ( sdctl, FCN_XX_HIDRVB, XX_SD_CTL_DRV_DEFAULT ); ! 2106: EFAB_SET_DWORD_FIELD ( sdctl, FCN_XX_LODRVB, XX_SD_CTL_DRV_DEFAULT ); ! 2107: EFAB_SET_DWORD_FIELD ( sdctl, FCN_XX_HIDRVA, XX_SD_CTL_DRV_DEFAULT ); ! 2108: EFAB_SET_DWORD_FIELD ( sdctl, FCN_XX_LODRVA, XX_SD_CTL_DRV_DEFAULT ); ! 2109: falcon_xmac_writel ( efab, &sdctl, FCN_XX_SD_CTL_REG_MAC ); ! 2110: ! 2111: EFAB_POPULATE_DWORD_8 ( txdrv, ! 2112: FCN_XX_DEQD, XX_TXDRV_DEQ_DEFAULT, ! 2113: FCN_XX_DEQC, XX_TXDRV_DEQ_DEFAULT, ! 2114: FCN_XX_DEQB, XX_TXDRV_DEQ_DEFAULT, ! 2115: FCN_XX_DEQA, XX_TXDRV_DEQ_DEFAULT, ! 2116: FCN_XX_DTXD, XX_TXDRV_DTX_DEFAULT, ! 2117: FCN_XX_DTXC, XX_TXDRV_DTX_DEFAULT, ! 2118: FCN_XX_DTXB, XX_TXDRV_DTX_DEFAULT, ! 2119: FCN_XX_DTXA, XX_TXDRV_DTX_DEFAULT); ! 2120: falcon_xmac_writel ( efab, &txdrv, FCN_XX_TXDRV_CTL_REG_MAC); ! 2121: } ! 2122: ! 2123: static int ! 2124: falcon_xgmii_status ( struct efab_nic *efab ) ! 2125: { ! 2126: efab_dword_t reg; ! 2127: ! 2128: if ( efab->pci_revision < FALCON_REV_B0 ) ! 2129: return 1; ! 2130: /* The ISR latches, so clear it and re-read */ ! 2131: falcon_xmac_readl ( efab, ®, FCN_XM_MGT_INT_REG_MAC_B0 ); ! 2132: falcon_xmac_readl ( efab, ®, FCN_XM_MGT_INT_REG_MAC_B0 ); ! 2133: ! 2134: if ( EFAB_DWORD_FIELD ( reg, FCN_XM_LCLFLT ) || ! 2135: EFAB_DWORD_FIELD ( reg, FCN_XM_RMTFLT ) ) { ! 2136: EFAB_TRACE ( "MGT_INT: "EFAB_DWORD_FMT"\n", ! 2137: EFAB_DWORD_VAL ( reg ) ); ! 2138: return 0; ! 2139: } ! 2140: ! 2141: return 1; ! 2142: } ! 2143: ! 2144: static void ! 2145: falcon_mask_status_intr ( struct efab_nic *efab, int enable ) ! 2146: { ! 2147: efab_dword_t reg; ! 2148: ! 2149: if ( efab->pci_revision < FALCON_REV_B0 ) ! 2150: return; ! 2151: ! 2152: /* Flush the ISR */ ! 2153: if ( enable ) ! 2154: falcon_xmac_readl ( efab, ®, FCN_XM_MGT_INT_REG_MAC_B0 ); ! 2155: ! 2156: EFAB_POPULATE_DWORD_2 ( reg, ! 2157: FCN_XM_MSK_RMTFLT, !enable, ! 2158: FCN_XM_MSK_LCLFLT, !enable); ! 2159: falcon_xmac_readl ( efab, ®, FCN_XM_MGT_INT_MSK_REG_MAC_B0 ); ! 2160: } ! 2161: ! 2162: /** ! 2163: * Reset 10G MAC connected to port ! 2164: * ! 2165: */ ! 2166: static int ! 2167: falcon_reset_xmac ( struct efab_nic *efab ) ! 2168: { ! 2169: efab_dword_t reg; ! 2170: int count; ! 2171: ! 2172: EFAB_POPULATE_DWORD_1 ( reg, FCN_XM_CORE_RST, 1 ); ! 2173: falcon_xmac_writel ( efab, ®, FCN_XM_GLB_CFG_REG_MAC ); ! 2174: ! 2175: for ( count = 0 ; count < 1000 ; count++ ) { ! 2176: udelay ( 10 ); ! 2177: falcon_xmac_readl ( efab, ®, ! 2178: FCN_XM_GLB_CFG_REG_MAC ); ! 2179: if ( EFAB_DWORD_FIELD ( reg, FCN_XM_CORE_RST ) == 0 ) ! 2180: return 0; ! 2181: } ! 2182: return -ETIMEDOUT; ! 2183: } ! 2184: ! 2185: ! 2186: static int ! 2187: falcon_reset_xaui ( struct efab_nic *efab ) ! 2188: { ! 2189: efab_dword_t reg; ! 2190: int count; ! 2191: ! 2192: if (!efab->is_asic) ! 2193: return 0; ! 2194: ! 2195: EFAB_POPULATE_DWORD_1 ( reg, FCN_XX_RST_XX_EN, 1 ); ! 2196: falcon_xmac_writel ( efab, ®, FCN_XX_PWR_RST_REG_MAC ); ! 2197: ! 2198: /* Give some time for the link to establish */ ! 2199: for (count = 0; count < 1000; count++) { /* wait upto 10ms */ ! 2200: falcon_xmac_readl ( efab, ®, FCN_XX_PWR_RST_REG_MAC ); ! 2201: if ( EFAB_DWORD_FIELD ( reg, FCN_XX_RST_XX_EN ) == 0 ) { ! 2202: falcon_setup_xaui ( efab ); ! 2203: return 0; ! 2204: } ! 2205: udelay(10); ! 2206: } ! 2207: EFAB_ERR ( "timed out waiting for XAUI/XGXS reset\n" ); ! 2208: return -ETIMEDOUT; ! 2209: } ! 2210: ! 2211: static int ! 2212: falcon_xaui_link_ok ( struct efab_nic *efab ) ! 2213: { ! 2214: efab_dword_t reg; ! 2215: int align_done, lane_status, sync; ! 2216: int has_phyxs; ! 2217: int link_ok = 1; ! 2218: ! 2219: /* Read Falcon XAUI side */ ! 2220: if ( efab->is_asic ) { ! 2221: /* Read link status */ ! 2222: falcon_xmac_readl ( efab, ®, FCN_XX_CORE_STAT_REG_MAC ); ! 2223: align_done = EFAB_DWORD_FIELD ( reg, FCN_XX_ALIGN_DONE ); ! 2224: ! 2225: sync = EFAB_DWORD_FIELD ( reg, FCN_XX_SYNC_STAT ); ! 2226: sync = ( sync == FCN_XX_SYNC_STAT_DECODE_SYNCED ); ! 2227: ! 2228: link_ok = align_done && sync; ! 2229: } ! 2230: ! 2231: /* Clear link status ready for next read */ ! 2232: EFAB_SET_DWORD_FIELD ( reg, FCN_XX_COMMA_DET, FCN_XX_COMMA_DET_RESET ); ! 2233: EFAB_SET_DWORD_FIELD ( reg, FCN_XX_CHARERR, FCN_XX_CHARERR_RESET); ! 2234: EFAB_SET_DWORD_FIELD ( reg, FCN_XX_DISPERR, FCN_XX_DISPERR_RESET); ! 2235: falcon_xmac_writel ( efab, ®, FCN_XX_CORE_STAT_REG_MAC ); ! 2236: ! 2237: has_phyxs = ( efab->phy_op->mmds & ( 1 << MDIO_MMD_PHYXS ) ); ! 2238: if ( link_ok && has_phyxs ) { ! 2239: lane_status = falcon_mdio_read ( efab, MDIO_MMD_PHYXS, ! 2240: MDIO_PHYXS_LANE_STATE ); ! 2241: link_ok = ( lane_status & ( 1 << MDIO_PHYXS_LANE_ALIGNED_LBN ) ); ! 2242: ! 2243: if (!link_ok ) ! 2244: EFAB_LOG ( "XGXS lane status: %x\n", lane_status ); ! 2245: } ! 2246: ! 2247: return link_ok; ! 2248: } ! 2249: ! 2250: /** ! 2251: * Initialise XMAC ! 2252: * ! 2253: */ ! 2254: static void ! 2255: falcon_reconfigure_xmac ( struct efab_nic *efab ) ! 2256: { ! 2257: efab_dword_t reg; ! 2258: int max_frame_len; ! 2259: ! 2260: /* Configure MAC - cut-thru mode is hard wired on */ ! 2261: EFAB_POPULATE_DWORD_3 ( reg, ! 2262: FCN_XM_RX_JUMBO_MODE, 1, ! 2263: FCN_XM_TX_STAT_EN, 1, ! 2264: FCN_XM_RX_STAT_EN, 1); ! 2265: falcon_xmac_writel ( efab, ®, FCN_XM_GLB_CFG_REG_MAC ); ! 2266: ! 2267: /* Configure TX */ ! 2268: EFAB_POPULATE_DWORD_6 ( reg, ! 2269: FCN_XM_TXEN, 1, ! 2270: FCN_XM_TX_PRMBL, 1, ! 2271: FCN_XM_AUTO_PAD, 1, ! 2272: FCN_XM_TXCRC, 1, ! 2273: FCN_XM_FCNTL, 1, ! 2274: FCN_XM_IPG, 0x3 ); ! 2275: falcon_xmac_writel ( efab, ®, FCN_XM_TX_CFG_REG_MAC ); ! 2276: ! 2277: /* Configure RX */ ! 2278: EFAB_POPULATE_DWORD_4 ( reg, ! 2279: FCN_XM_RXEN, 1, ! 2280: FCN_XM_AUTO_DEPAD, 0, ! 2281: FCN_XM_ACPT_ALL_MCAST, 1, ! 2282: FCN_XM_PASS_CRC_ERR, 1 ); ! 2283: falcon_xmac_writel ( efab, ®, FCN_XM_RX_CFG_REG_MAC ); ! 2284: ! 2285: /* Set frame length */ ! 2286: max_frame_len = EFAB_MAX_FRAME_LEN ( ETH_FRAME_LEN ); ! 2287: EFAB_POPULATE_DWORD_1 ( reg, ! 2288: FCN_XM_MAX_RX_FRM_SIZE, max_frame_len ); ! 2289: falcon_xmac_writel ( efab, ®, FCN_XM_RX_PARAM_REG_MAC ); ! 2290: EFAB_POPULATE_DWORD_2 ( reg, ! 2291: FCN_XM_MAX_TX_FRM_SIZE, max_frame_len, ! 2292: FCN_XM_TX_JUMBO_MODE, 1 ); ! 2293: falcon_xmac_writel ( efab, ®, FCN_XM_TX_PARAM_REG_MAC ); ! 2294: ! 2295: /* Enable flow control receipt */ ! 2296: EFAB_POPULATE_DWORD_2 ( reg, ! 2297: FCN_XM_PAUSE_TIME, 0xfffe, ! 2298: FCN_XM_DIS_FCNTL, 0 ); ! 2299: falcon_xmac_writel ( efab, ®, FCN_XM_FC_REG_MAC ); ! 2300: ! 2301: /* Set MAC address */ ! 2302: EFAB_POPULATE_DWORD_4 ( reg, ! 2303: FCN_XM_ADR_0, efab->mac_addr[0], ! 2304: FCN_XM_ADR_1, efab->mac_addr[1], ! 2305: FCN_XM_ADR_2, efab->mac_addr[2], ! 2306: FCN_XM_ADR_3, efab->mac_addr[3] ); ! 2307: falcon_xmac_writel ( efab, ®, FCN_XM_ADR_LO_REG_MAC ); ! 2308: EFAB_POPULATE_DWORD_2 ( reg, ! 2309: FCN_XM_ADR_4, efab->mac_addr[4], ! 2310: FCN_XM_ADR_5, efab->mac_addr[5] ); ! 2311: falcon_xmac_writel ( efab, ®, FCN_XM_ADR_HI_REG_MAC ); ! 2312: } ! 2313: ! 2314: static int ! 2315: falcon_init_xmac ( struct efab_nic *efab ) ! 2316: { ! 2317: int count, rc; ! 2318: ! 2319: /* Mask the PHY management interrupt */ ! 2320: falcon_mask_status_intr ( efab, 0 ); ! 2321: ! 2322: /* Initialise the PHY to instantiate the clock. */ ! 2323: rc = efab->phy_op->init ( efab ); ! 2324: if ( rc ) { ! 2325: EFAB_ERR ( "unable to initialise PHY\n" ); ! 2326: goto fail1; ! 2327: } ! 2328: ! 2329: falcon_reset_xaui ( efab ); ! 2330: ! 2331: /* Give the PHY and MAC time to faff */ ! 2332: mdelay ( 100 ); ! 2333: ! 2334: /* Reset and reconfigure the XMAC */ ! 2335: rc = falcon_reset_xmac ( efab ); ! 2336: if ( rc ) ! 2337: goto fail2; ! 2338: falcon_reconfigure_xmac ( efab ); ! 2339: falcon_reconfigure_mac_wrapper ( efab ); ! 2340: /** ! 2341: * Now wait for the link to come up. This may take a while ! 2342: * for some slower PHY's. ! 2343: */ ! 2344: for (count=0; count<50; count++) { ! 2345: int link_ok = 1; ! 2346: ! 2347: /* Wait a while for the link to come up. */ ! 2348: mdelay ( 100 ); ! 2349: if ((count % 5) == 0) ! 2350: putchar ( '.' ); ! 2351: ! 2352: /* Does the PHY think the wire-side link is up? */ ! 2353: link_ok = mdio_clause45_links_ok ( efab ); ! 2354: /* Ensure the XAUI link to the PHY is good */ ! 2355: if ( link_ok ) { ! 2356: link_ok = falcon_xaui_link_ok ( efab ); ! 2357: if ( !link_ok ) ! 2358: falcon_reset_xaui ( efab ); ! 2359: } ! 2360: ! 2361: /* Check fault indication */ ! 2362: if ( link_ok ) ! 2363: link_ok = falcon_xgmii_status ( efab ); ! 2364: ! 2365: efab->link_up = link_ok; ! 2366: if ( link_ok ) { ! 2367: /* unmask the status interrupt */ ! 2368: falcon_mask_status_intr ( efab, 1 ); ! 2369: return 0; ! 2370: } ! 2371: } ! 2372: ! 2373: /* Link failed to come up, but initialisation was fine. */ ! 2374: rc = -ETIMEDOUT; ! 2375: ! 2376: fail2: ! 2377: fail1: ! 2378: return rc; ! 2379: } ! 2380: ! 2381: static struct efab_mac_operations falcon_xmac_operations = { ! 2382: .init = falcon_init_xmac, ! 2383: }; ! 2384: ! 2385: /******************************************************************************* ! 2386: * ! 2387: * ! 2388: * Null PHY handling ! 2389: * ! 2390: * ! 2391: *******************************************************************************/ ! 2392: ! 2393: static int ! 2394: falcon_xaui_phy_init ( struct efab_nic *efab ) ! 2395: { ! 2396: /* CX4 is always 10000FD only */ ! 2397: efab->link_options = LPA_EF_10000FULL; ! 2398: ! 2399: /* There is no PHY! */ ! 2400: return 0; ! 2401: } ! 2402: ! 2403: static struct efab_phy_operations falcon_xaui_phy_ops = { ! 2404: .init = falcon_xaui_phy_init, ! 2405: .mmds = 0, ! 2406: }; ! 2407: ! 2408: ! 2409: /******************************************************************************* ! 2410: * ! 2411: * ! 2412: * Alaska PHY ! 2413: * ! 2414: * ! 2415: *******************************************************************************/ ! 2416: ! 2417: /** ! 2418: * Initialise Alaska PHY ! 2419: * ! 2420: */ ! 2421: static int ! 2422: alaska_init ( struct efab_nic *efab ) ! 2423: { ! 2424: unsigned int advertised, lpa; ! 2425: ! 2426: /* Read link up status */ ! 2427: efab->link_up = gmii_link_ok ( efab ); ! 2428: ! 2429: if ( ! efab->link_up ) ! 2430: return -EIO; ! 2431: ! 2432: /* Determine link options from PHY. */ ! 2433: advertised = gmii_autoneg_advertised ( efab ); ! 2434: lpa = gmii_autoneg_lpa ( efab ); ! 2435: efab->link_options = gmii_nway_result ( advertised & lpa ); ! 2436: ! 2437: return 0; ! 2438: } ! 2439: ! 2440: static struct efab_phy_operations falcon_alaska_phy_ops = { ! 2441: .init = alaska_init, ! 2442: }; ! 2443: ! 2444: /******************************************************************************* ! 2445: * ! 2446: * ! 2447: * xfp ! 2448: * ! 2449: * ! 2450: *******************************************************************************/ ! 2451: ! 2452: #define XFP_REQUIRED_DEVS ( MDIO_MMDREG_DEVS0_PCS | \ ! 2453: MDIO_MMDREG_DEVS0_PMAPMD | \ ! 2454: MDIO_MMDREG_DEVS0_PHYXS ) ! 2455: ! 2456: static int ! 2457: falcon_xfp_phy_init ( struct efab_nic *efab ) ! 2458: { ! 2459: int rc; ! 2460: ! 2461: /* Optical link is always 10000FD only */ ! 2462: efab->link_options = LPA_EF_10000FULL; ! 2463: ! 2464: /* Reset the PHY */ ! 2465: rc = mdio_clause45_reset_mmd ( efab, MDIO_MMD_PHYXS ); ! 2466: if ( rc ) ! 2467: return rc; ! 2468: ! 2469: return 0; ! 2470: } ! 2471: ! 2472: static struct efab_phy_operations falcon_xfp_phy_ops = { ! 2473: .init = falcon_xfp_phy_init, ! 2474: .mmds = XFP_REQUIRED_DEVS, ! 2475: }; ! 2476: ! 2477: /******************************************************************************* ! 2478: * ! 2479: * ! 2480: * txc43128 ! 2481: * ! 2482: * ! 2483: *******************************************************************************/ ! 2484: ! 2485: /* Command register */ ! 2486: #define TXC_GLRGS_GLCMD (0xc004) ! 2487: #define TXC_GLCMD_LMTSWRST_LBN (14) ! 2488: ! 2489: /* Amplitude on lanes 0+1, 2+3 */ ! 2490: #define TXC_ALRGS_ATXAMP0 (0xc041) ! 2491: #define TXC_ALRGS_ATXAMP1 (0xc042) ! 2492: /* Bit position of value for lane 0+2, 1+3 */ ! 2493: #define TXC_ATXAMP_LANE02_LBN (3) ! 2494: #define TXC_ATXAMP_LANE13_LBN (11) ! 2495: ! 2496: #define TXC_ATXAMP_1280_mV (0) ! 2497: #define TXC_ATXAMP_1200_mV (8) ! 2498: #define TXC_ATXAMP_1120_mV (12) ! 2499: #define TXC_ATXAMP_1060_mV (14) ! 2500: #define TXC_ATXAMP_0820_mV (25) ! 2501: #define TXC_ATXAMP_0720_mV (26) ! 2502: #define TXC_ATXAMP_0580_mV (27) ! 2503: #define TXC_ATXAMP_0440_mV (28) ! 2504: ! 2505: #define TXC_ATXAMP_0820_BOTH ( (TXC_ATXAMP_0820_mV << TXC_ATXAMP_LANE02_LBN) | \ ! 2506: (TXC_ATXAMP_0820_mV << TXC_ATXAMP_LANE13_LBN) ) ! 2507: ! 2508: #define TXC_ATXAMP_DEFAULT (0x6060) /* From databook */ ! 2509: ! 2510: /* Preemphasis on lanes 0+1, 2+3 */ ! 2511: #define TXC_ALRGS_ATXPRE0 (0xc043) ! 2512: #define TXC_ALRGS_ATXPRE1 (0xc044) ! 2513: ! 2514: #define TXC_ATXPRE_NONE (0) ! 2515: #define TXC_ATXPRE_DEFAULT (0x1010) /* From databook */ ! 2516: ! 2517: #define TXC_REQUIRED_DEVS ( MDIO_MMDREG_DEVS0_PCS | \ ! 2518: MDIO_MMDREG_DEVS0_PMAPMD | \ ! 2519: MDIO_MMDREG_DEVS0_PHYXS ) ! 2520: ! 2521: static int ! 2522: falcon_txc_logic_reset ( struct efab_nic *efab ) ! 2523: { ! 2524: int val; ! 2525: int tries = 50; ! 2526: ! 2527: val = falcon_mdio_read ( efab, MDIO_MMD_PCS, TXC_GLRGS_GLCMD ); ! 2528: val |= (1 << TXC_GLCMD_LMTSWRST_LBN); ! 2529: falcon_mdio_write ( efab, MDIO_MMD_PCS, TXC_GLRGS_GLCMD, val ); ! 2530: ! 2531: while ( tries--) { ! 2532: val = falcon_mdio_read ( efab, MDIO_MMD_PCS, TXC_GLRGS_GLCMD ); ! 2533: if ( ~val & ( 1 << TXC_GLCMD_LMTSWRST_LBN ) ) ! 2534: return 0; ! 2535: udelay(1); ! 2536: } ! 2537: ! 2538: EFAB_ERR ( "logic reset failed\n" ); ! 2539: ! 2540: return -ETIMEDOUT; ! 2541: } ! 2542: ! 2543: static int ! 2544: falcon_txc_phy_init ( struct efab_nic *efab ) ! 2545: { ! 2546: int rc; ! 2547: ! 2548: /* CX4 is always 10000FD only */ ! 2549: efab->link_options = LPA_EF_10000FULL; ! 2550: ! 2551: /* reset the phy */ ! 2552: rc = mdio_clause45_reset_mmd ( efab, MDIO_MMD_PMAPMD ); ! 2553: if ( rc ) ! 2554: goto fail1; ! 2555: ! 2556: rc = mdio_clause45_check_mmds ( efab ); ! 2557: if ( rc ) ! 2558: goto fail2; ! 2559: ! 2560: /* Turn amplitude down and preemphasis off on the host side ! 2561: * (PHY<->MAC) as this is believed less likely to upset falcon ! 2562: * and no adverse effects have been noted. It probably also ! 2563: * saves a picowatt or two */ ! 2564: ! 2565: /* Turn off preemphasis */ ! 2566: falcon_mdio_write ( efab, MDIO_MMD_PHYXS, TXC_ALRGS_ATXPRE0, ! 2567: TXC_ATXPRE_NONE ); ! 2568: falcon_mdio_write ( efab, MDIO_MMD_PHYXS, TXC_ALRGS_ATXPRE1, ! 2569: TXC_ATXPRE_NONE ); ! 2570: ! 2571: /* Turn down the amplitude */ ! 2572: falcon_mdio_write ( efab, MDIO_MMD_PHYXS, TXC_ALRGS_ATXAMP0, ! 2573: TXC_ATXAMP_0820_BOTH ); ! 2574: falcon_mdio_write ( efab, MDIO_MMD_PHYXS, TXC_ALRGS_ATXAMP1, ! 2575: TXC_ATXAMP_0820_BOTH ); ! 2576: ! 2577: /* Set the line side amplitude and preemphasis to the databook ! 2578: * defaults as an erratum causes them to be 0 on at least some ! 2579: * PHY rev.s */ ! 2580: falcon_mdio_write ( efab, MDIO_MMD_PMAPMD, TXC_ALRGS_ATXPRE0, ! 2581: TXC_ATXPRE_DEFAULT ); ! 2582: falcon_mdio_write ( efab, MDIO_MMD_PMAPMD, TXC_ALRGS_ATXPRE1, ! 2583: TXC_ATXPRE_DEFAULT ); ! 2584: falcon_mdio_write ( efab, MDIO_MMD_PMAPMD, TXC_ALRGS_ATXAMP0, ! 2585: TXC_ATXAMP_DEFAULT ); ! 2586: falcon_mdio_write ( efab, MDIO_MMD_PMAPMD, TXC_ALRGS_ATXAMP1, ! 2587: TXC_ATXAMP_DEFAULT ); ! 2588: ! 2589: rc = falcon_txc_logic_reset ( efab ); ! 2590: if ( rc ) ! 2591: goto fail3; ! 2592: ! 2593: return 0; ! 2594: ! 2595: fail3: ! 2596: fail2: ! 2597: fail1: ! 2598: return rc; ! 2599: } ! 2600: ! 2601: static struct efab_phy_operations falcon_txc_phy_ops = { ! 2602: .init = falcon_txc_phy_init, ! 2603: .mmds = TXC_REQUIRED_DEVS, ! 2604: }; ! 2605: ! 2606: /******************************************************************************* ! 2607: * ! 2608: * ! 2609: * tenxpress ! 2610: * ! 2611: * ! 2612: *******************************************************************************/ ! 2613: ! 2614: ! 2615: #define TENXPRESS_REQUIRED_DEVS ( MDIO_MMDREG_DEVS0_PMAPMD | \ ! 2616: MDIO_MMDREG_DEVS0_PCS | \ ! 2617: MDIO_MMDREG_DEVS0_PHYXS ) ! 2618: ! 2619: #define PCS_TEST_SELECT_REG 0xd807 /* PRM 10.5.8 */ ! 2620: #define CLK312_EN_LBN 3 ! 2621: #define CLK312_EN_WIDTH 1 ! 2622: ! 2623: #define PCS_CLOCK_CTRL_REG 0xd801 ! 2624: #define PLL312_RST_N_LBN 2 ! 2625: ! 2626: /* Special Software reset register */ ! 2627: #define PMA_PMD_EXT_CTRL_REG 49152 ! 2628: #define PMA_PMD_EXT_SSR_LBN 15 ! 2629: ! 2630: /* Boot status register */ ! 2631: #define PCS_BOOT_STATUS_REG 0xd000 ! 2632: #define PCS_BOOT_FATAL_ERR_LBN 0 ! 2633: #define PCS_BOOT_PROGRESS_LBN 1 ! 2634: #define PCS_BOOT_PROGRESS_WIDTH 2 ! 2635: #define PCS_BOOT_COMPLETE_LBN 3 ! 2636: ! 2637: #define PCS_SOFT_RST2_REG 0xd806 ! 2638: #define SERDES_RST_N_LBN 13 ! 2639: #define XGXS_RST_N_LBN 12 ! 2640: ! 2641: static int ! 2642: falcon_tenxpress_check_c11 ( struct efab_nic *efab ) ! 2643: { ! 2644: int count; ! 2645: uint32_t boot_stat; ! 2646: ! 2647: /* Check that the C11 CPU has booted */ ! 2648: for (count=0; count<10; count++) { ! 2649: boot_stat = falcon_mdio_read ( efab, MDIO_MMD_PCS, ! 2650: PCS_BOOT_STATUS_REG ); ! 2651: if ( boot_stat & ( 1 << PCS_BOOT_COMPLETE_LBN ) ) ! 2652: return 0; ! 2653: ! 2654: udelay(10); ! 2655: } ! 2656: ! 2657: EFAB_ERR ( "C11 failed to boot\n" ); ! 2658: return -ETIMEDOUT; ! 2659: } ! 2660: ! 2661: static int ! 2662: falcon_tenxpress_phy_init ( struct efab_nic *efab ) ! 2663: { ! 2664: int rc, reg; ! 2665: ! 2666: /* 10XPRESS is always 10000FD (at the moment) */ ! 2667: efab->link_options = LPA_EF_10000FULL; ! 2668: ! 2669: /* Wait for the blocks to come out of reset */ ! 2670: rc = mdio_clause45_wait_reset_mmds ( efab ); ! 2671: if ( rc ) ! 2672: goto fail1; ! 2673: ! 2674: rc = mdio_clause45_check_mmds ( efab ); ! 2675: if ( rc ) ! 2676: goto fail2; ! 2677: ! 2678: /* Turn on the clock */ ! 2679: reg = (1 << CLK312_EN_LBN); ! 2680: falcon_mdio_write ( efab, MDIO_MMD_PCS, PCS_TEST_SELECT_REG, reg); ! 2681: ! 2682: /* Wait 200ms for the PHY to boot */ ! 2683: mdelay(200); ! 2684: ! 2685: rc = falcon_tenxpress_check_c11 ( efab ); ! 2686: if ( rc ) ! 2687: goto fail3; ! 2688: ! 2689: return 0; ! 2690: ! 2691: fail3: ! 2692: fail2: ! 2693: fail1: ! 2694: return rc; ! 2695: } ! 2696: ! 2697: static struct efab_phy_operations falcon_tenxpress_phy_ops = { ! 2698: .init = falcon_tenxpress_phy_init, ! 2699: .mmds = TENXPRESS_REQUIRED_DEVS, ! 2700: }; ! 2701: ! 2702: /******************************************************************************* ! 2703: * ! 2704: * ! 2705: * PM8358 ! 2706: * ! 2707: * ! 2708: *******************************************************************************/ ! 2709: ! 2710: /* The PM8358 just presents a DTE XS */ ! 2711: #define PM8358_REQUIRED_DEVS (MDIO_MMDREG_DEVS0_DTEXS) ! 2712: ! 2713: /* PHY-specific definitions */ ! 2714: /* Master ID and Global Performance Monitor Update */ ! 2715: #define PMC_MASTER_REG (0xd000) ! 2716: /* Analog Tx Rx settings under software control */ ! 2717: #define PMC_MASTER_ANLG_CTRL (1<< 11) ! 2718: ! 2719: /* Master Configuration register 2 */ ! 2720: #define PMC_MCONF2_REG (0xd002) ! 2721: /* Drive Tx off centre of data eye (1) vs. clock edge (0) */ ! 2722: #define PMC_MCONF2_TEDGE (1 << 2) ! 2723: /* Drive Rx off centre of data eye (1) vs. clock edge (0) */ ! 2724: #define PMC_MCONF2_REDGE (1 << 3) ! 2725: ! 2726: /* Analog Rx settings */ ! 2727: #define PMC_ANALOG_RX_CFG0 (0xd025) ! 2728: #define PMC_ANALOG_RX_CFG1 (0xd02d) ! 2729: #define PMC_ANALOG_RX_CFG2 (0xd035) ! 2730: #define PMC_ANALOG_RX_CFG3 (0xd03d) ! 2731: ! 2732: ! 2733: #define PMC_ANALOG_RX_TERM (1 << 15) /* Bit 15 of RX CFG: 0 for 100 ohms float, ! 2734: 1 for 50 to 1.2V */ ! 2735: #define PMC_ANALOG_RX_EQ_MASK (3 << 8) ! 2736: #define PMC_ANALOG_RX_EQ_NONE (0 << 8) ! 2737: #define PMC_ANALOG_RX_EQ_HALF (1 << 8) ! 2738: #define PMC_ANALOG_RX_EQ_FULL (2 << 8) ! 2739: #define PMC_ANALOG_RX_EQ_RSVD (3 << 8) ! 2740: ! 2741: static int ! 2742: falcon_pm8358_phy_init ( struct efab_nic *efab ) ! 2743: { ! 2744: int rc, reg, i; ! 2745: ! 2746: /* This is a XAUI retimer part */ ! 2747: efab->link_options = LPA_EF_10000FULL; ! 2748: ! 2749: rc = mdio_clause45_reset_mmd ( efab, MDIO_MMDREG_DEVS0_DTEXS ); ! 2750: if ( rc ) ! 2751: return rc; ! 2752: ! 2753: /* Enable software control of analogue settings */ ! 2754: reg = falcon_mdio_read ( efab, MDIO_MMD_DTEXS, PMC_MASTER_REG ); ! 2755: reg |= PMC_MASTER_ANLG_CTRL; ! 2756: falcon_mdio_write ( efab, MDIO_MMD_DTEXS, PMC_MASTER_REG, reg ); ! 2757: ! 2758: /* Turn rx eq on for all channels */ ! 2759: for (i=0; i< 3; i++) { ! 2760: /* The analog CFG registers are evenly spaced 8 apart */ ! 2761: uint16_t addr = PMC_ANALOG_RX_CFG0 + 8*i; ! 2762: reg = falcon_mdio_read ( efab, MDIO_MMD_DTEXS, addr ); ! 2763: reg = ( reg & ~PMC_ANALOG_RX_EQ_MASK ) | PMC_ANALOG_RX_EQ_FULL; ! 2764: falcon_mdio_write ( efab, MDIO_MMD_DTEXS, addr, reg ); ! 2765: } ! 2766: ! 2767: /* Set TEDGE, clear REDGE */ ! 2768: reg = falcon_mdio_read ( efab, MDIO_MMD_DTEXS, PMC_MCONF2_REG ); ! 2769: reg = ( reg & ~PMC_MCONF2_REDGE) | PMC_MCONF2_TEDGE; ! 2770: falcon_mdio_write ( efab, MDIO_MMD_DTEXS, PMC_MCONF2_REG, reg ); ! 2771: ! 2772: return 0; ! 2773: } ! 2774: ! 2775: static struct efab_phy_operations falcon_pm8358_phy_ops = { ! 2776: .init = falcon_pm8358_phy_init, ! 2777: .mmds = PM8358_REQUIRED_DEVS, ! 2778: }; ! 2779: ! 2780: /******************************************************************************* ! 2781: * ! 2782: * ! 2783: * SFE4001 support ! 2784: * ! 2785: * ! 2786: *******************************************************************************/ ! 2787: ! 2788: #define MAX_TEMP_THRESH 90 ! 2789: ! 2790: /* I2C Expander */ ! 2791: #define PCA9539 0x74 ! 2792: ! 2793: #define P0_IN 0x00 ! 2794: #define P0_OUT 0x02 ! 2795: #define P0_CONFIG 0x06 ! 2796: ! 2797: #define P0_EN_1V0X_LBN 0 ! 2798: #define P0_EN_1V0X_WIDTH 1 ! 2799: #define P0_EN_1V2_LBN 1 ! 2800: #define P0_EN_1V2_WIDTH 1 ! 2801: #define P0_EN_2V5_LBN 2 ! 2802: #define P0_EN_2V5_WIDTH 1 ! 2803: #define P0_EN_3V3X_LBN 3 ! 2804: #define P0_EN_3V3X_WIDTH 1 ! 2805: #define P0_EN_5V_LBN 4 ! 2806: #define P0_EN_5V_WIDTH 1 ! 2807: #define P0_X_TRST_LBN 6 ! 2808: #define P0_X_TRST_WIDTH 1 ! 2809: ! 2810: #define P1_IN 0x01 ! 2811: #define P1_CONFIG 0x07 ! 2812: ! 2813: #define P1_AFE_PWD_LBN 0 ! 2814: #define P1_AFE_PWD_WIDTH 1 ! 2815: #define P1_DSP_PWD25_LBN 1 ! 2816: #define P1_DSP_PWD25_WIDTH 1 ! 2817: #define P1_SPARE_LBN 4 ! 2818: #define P1_SPARE_WIDTH 4 ! 2819: ! 2820: /* Temperature Sensor */ ! 2821: #define MAX6647 0x4e ! 2822: ! 2823: #define RSL 0x02 ! 2824: #define RLHN 0x05 ! 2825: #define WLHO 0x0b ! 2826: ! 2827: static struct i2c_device i2c_pca9539 = { ! 2828: .dev_addr = PCA9539, ! 2829: .dev_addr_len = 1, ! 2830: .word_addr_len = 1, ! 2831: }; ! 2832: ! 2833: ! 2834: static struct i2c_device i2c_max6647 = { ! 2835: .dev_addr = MAX6647, ! 2836: .dev_addr_len = 1, ! 2837: .word_addr_len = 1, ! 2838: }; ! 2839: ! 2840: static int ! 2841: sfe4001_init ( struct efab_nic *efab ) ! 2842: { ! 2843: struct i2c_interface *i2c = &efab->i2c_bb.i2c; ! 2844: efab_dword_t reg; ! 2845: uint8_t in, cfg, out; ! 2846: int count, rc; ! 2847: ! 2848: EFAB_LOG ( "Initialise SFE4001 board\n" ); ! 2849: ! 2850: /* Ensure XGXS and XAUI SerDes are held in reset */ ! 2851: EFAB_POPULATE_DWORD_7 ( reg, ! 2852: FCN_XX_PWRDNA_EN, 1, ! 2853: FCN_XX_PWRDNB_EN, 1, ! 2854: FCN_XX_RSTPLLAB_EN, 1, ! 2855: FCN_XX_RESETA_EN, 1, ! 2856: FCN_XX_RESETB_EN, 1, ! 2857: FCN_XX_RSTXGXSRX_EN, 1, ! 2858: FCN_XX_RSTXGXSTX_EN, 1 ); ! 2859: falcon_xmac_writel ( efab, ®, FCN_XX_PWR_RST_REG_MAC); ! 2860: udelay(10); ! 2861: ! 2862: /* Set DSP over-temperature alert threshold */ ! 2863: cfg = MAX_TEMP_THRESH; ! 2864: rc = i2c->write ( i2c, &i2c_max6647, WLHO, &cfg, EFAB_BYTE ); ! 2865: if ( rc ) ! 2866: goto fail1; ! 2867: ! 2868: /* Read it back and verify */ ! 2869: rc = i2c->read ( i2c, &i2c_max6647, RLHN, &in, EFAB_BYTE ); ! 2870: if ( rc ) ! 2871: goto fail2; ! 2872: ! 2873: if ( in != MAX_TEMP_THRESH ) { ! 2874: EFAB_ERR ( "Unable to verify MAX6647 limit (requested=%d " ! 2875: "confirmed=%d)\n", cfg, in ); ! 2876: rc = -EIO; ! 2877: goto fail3; ! 2878: } ! 2879: ! 2880: /* Clear any previous over-temperature alert */ ! 2881: rc = i2c->read ( i2c, &i2c_max6647, RSL, &in, EFAB_BYTE ); ! 2882: if ( rc ) ! 2883: goto fail4; ! 2884: ! 2885: /* Enable port 0 and 1 outputs on IO expander */ ! 2886: cfg = 0x00; ! 2887: rc = i2c->write ( i2c, &i2c_pca9539, P0_CONFIG, &cfg, EFAB_BYTE ); ! 2888: if ( rc ) ! 2889: goto fail5; ! 2890: cfg = 0xff & ~(1 << P1_SPARE_LBN); ! 2891: rc = i2c->write ( i2c, &i2c_pca9539, P1_CONFIG, &cfg, EFAB_BYTE ); ! 2892: if ( rc ) ! 2893: goto fail6; ! 2894: ! 2895: /* Turn all power off then wait 1 sec. This ensures PHY is reset */ ! 2896: out = 0xff & ~((0 << P0_EN_1V2_LBN) | (0 << P0_EN_2V5_LBN) | ! 2897: (0 << P0_EN_3V3X_LBN) | (0 << P0_EN_5V_LBN) | ! 2898: (0 << P0_EN_1V0X_LBN)); ! 2899: ! 2900: rc = i2c->write ( i2c, &i2c_pca9539, P0_OUT, &out, EFAB_BYTE ); ! 2901: if ( rc ) ! 2902: goto fail7; ! 2903: ! 2904: mdelay(1000); ! 2905: ! 2906: for (count=0; count<20; count++) { ! 2907: /* Turn on 1.2V, 2.5V, 3.3V and 5V power rails */ ! 2908: out = 0xff & ~( (1 << P0_EN_1V2_LBN) | (1 << P0_EN_2V5_LBN) | ! 2909: (1 << P0_EN_3V3X_LBN) | (1 << P0_EN_5V_LBN) | ! 2910: (1 << P0_X_TRST_LBN) ); ! 2911: ! 2912: rc = i2c->write ( i2c, &i2c_pca9539, P0_OUT, &out, EFAB_BYTE ); ! 2913: if ( rc ) ! 2914: goto fail8; ! 2915: ! 2916: mdelay ( 10 ); ! 2917: ! 2918: /* Turn on the 1V power rail */ ! 2919: out &= ~( 1 << P0_EN_1V0X_LBN ); ! 2920: rc = i2c->write ( i2c, &i2c_pca9539, P0_OUT, &out, EFAB_BYTE ); ! 2921: if ( rc ) ! 2922: goto fail9; ! 2923: ! 2924: EFAB_LOG ( "Waiting for power...(attempt %d)\n", count); ! 2925: mdelay ( 1000 ); ! 2926: ! 2927: /* Check DSP is powered */ ! 2928: rc = i2c->read ( i2c, &i2c_pca9539, P1_IN, &in, EFAB_BYTE ); ! 2929: if ( rc ) ! 2930: goto fail10; ! 2931: ! 2932: if ( in & ( 1 << P1_AFE_PWD_LBN ) ) ! 2933: return 0; ! 2934: } ! 2935: ! 2936: rc = -ETIMEDOUT; ! 2937: ! 2938: fail10: ! 2939: fail9: ! 2940: fail8: ! 2941: fail7: ! 2942: /* Turn off power rails */ ! 2943: out = 0xff; ! 2944: (void) i2c->write ( i2c, &i2c_pca9539, P0_OUT, &out, EFAB_BYTE ); ! 2945: /* Disable port 1 outputs on IO expander */ ! 2946: out = 0xff; ! 2947: (void) i2c->write ( i2c, &i2c_pca9539, P1_CONFIG, &out, EFAB_BYTE ); ! 2948: fail6: ! 2949: /* Disable port 0 outputs */ ! 2950: out = 0xff; ! 2951: (void) i2c->write ( i2c, &i2c_pca9539, P1_CONFIG, &out, EFAB_BYTE ); ! 2952: fail5: ! 2953: fail4: ! 2954: fail3: ! 2955: fail2: ! 2956: fail1: ! 2957: EFAB_ERR ( "Failed initialising SFE4001 board\n" ); ! 2958: return rc; ! 2959: } ! 2960: ! 2961: static void ! 2962: sfe4001_fini ( struct efab_nic *efab ) ! 2963: { ! 2964: struct i2c_interface *i2c = &efab->i2c_bb.i2c; ! 2965: uint8_t in, cfg, out; ! 2966: ! 2967: EFAB_ERR ( "Turning off SFE4001\n" ); ! 2968: ! 2969: /* Turn off all power rails */ ! 2970: out = 0xff; ! 2971: (void) i2c->write ( i2c, &i2c_pca9539, P0_OUT, &out, EFAB_BYTE ); ! 2972: ! 2973: /* Disable port 1 outputs on IO expander */ ! 2974: cfg = 0xff; ! 2975: (void) i2c->write ( i2c, &i2c_pca9539, P1_CONFIG, &cfg, EFAB_BYTE ); ! 2976: ! 2977: /* Disable port 0 outputs on IO expander */ ! 2978: cfg = 0xff; ! 2979: (void) i2c->write ( i2c, &i2c_pca9539, P0_CONFIG, &cfg, EFAB_BYTE ); ! 2980: ! 2981: /* Clear any over-temperature alert */ ! 2982: (void) i2c->read ( i2c, &i2c_max6647, RSL, &in, EFAB_BYTE ); ! 2983: } ! 2984: ! 2985: struct efab_board_operations sfe4001_ops = { ! 2986: .init = sfe4001_init, ! 2987: .fini = sfe4001_fini, ! 2988: }; ! 2989: ! 2990: static int sfe4002_init ( struct efab_nic *efab __attribute__((unused)) ) ! 2991: { ! 2992: return 0; ! 2993: } ! 2994: static void sfe4002_fini ( struct efab_nic *efab __attribute__((unused)) ) ! 2995: { ! 2996: } ! 2997: ! 2998: struct efab_board_operations sfe4002_ops = { ! 2999: .init = sfe4002_init, ! 3000: .fini = sfe4002_fini, ! 3001: }; ! 3002: ! 3003: static int sfe4003_init ( struct efab_nic *efab __attribute__((unused)) ) ! 3004: { ! 3005: return 0; ! 3006: } ! 3007: static void sfe4003_fini ( struct efab_nic *efab __attribute__((unused)) ) ! 3008: { ! 3009: } ! 3010: ! 3011: struct efab_board_operations sfe4003_ops = { ! 3012: .init = sfe4003_init, ! 3013: .fini = sfe4003_fini, ! 3014: }; ! 3015: ! 3016: /******************************************************************************* ! 3017: * ! 3018: * ! 3019: * Hardware initialisation ! 3020: * ! 3021: * ! 3022: *******************************************************************************/ ! 3023: ! 3024: static void ! 3025: falcon_free_special_buffer ( void *p ) ! 3026: { ! 3027: /* We don't bother cleaning up the buffer table entries - ! 3028: * we're hardly limited */ ! 3029: free_dma ( p, EFAB_BUF_ALIGN ); ! 3030: } ! 3031: ! 3032: static void* ! 3033: falcon_alloc_special_buffer ( struct efab_nic *efab, int bytes, ! 3034: struct efab_special_buffer *entry ) ! 3035: { ! 3036: void* buffer; ! 3037: int remaining; ! 3038: efab_qword_t buf_desc; ! 3039: unsigned long dma_addr; ! 3040: ! 3041: /* Allocate the buffer, aligned on a buffer address boundary */ ! 3042: buffer = malloc_dma ( bytes, EFAB_BUF_ALIGN ); ! 3043: if ( ! buffer ) ! 3044: return NULL; ! 3045: ! 3046: /* Push buffer table entries to back the buffer */ ! 3047: entry->id = efab->buffer_head; ! 3048: entry->dma_addr = dma_addr = virt_to_bus ( buffer ); ! 3049: assert ( ( dma_addr & ( EFAB_BUF_ALIGN - 1 ) ) == 0 ); ! 3050: ! 3051: remaining = bytes; ! 3052: while ( remaining > 0 ) { ! 3053: EFAB_POPULATE_QWORD_3 ( buf_desc, ! 3054: FCN_IP_DAT_BUF_SIZE, FCN_IP_DAT_BUF_SIZE_4K, ! 3055: FCN_BUF_ADR_FBUF, ( dma_addr >> 12 ), ! 3056: FCN_BUF_OWNER_ID_FBUF, 0 ); ! 3057: ! 3058: falcon_write_sram ( efab, &buf_desc, efab->buffer_head ); ! 3059: ! 3060: ++efab->buffer_head; ! 3061: dma_addr += EFAB_BUF_ALIGN; ! 3062: remaining -= EFAB_BUF_ALIGN; ! 3063: } ! 3064: ! 3065: EFAB_TRACE ( "Allocated 0x%x bytes at %p backed by buffer table " ! 3066: "entries 0x%x..0x%x\n", bytes, buffer, entry->id, ! 3067: efab->buffer_head - 1 ); ! 3068: ! 3069: return buffer; ! 3070: } ! 3071: ! 3072: static void ! 3073: clear_b0_fpga_memories ( struct efab_nic *efab) ! 3074: { ! 3075: efab_oword_t blanko, temp; ! 3076: int offset; ! 3077: ! 3078: EFAB_ZERO_OWORD ( blanko ); ! 3079: ! 3080: /* Clear the address region register */ ! 3081: EFAB_POPULATE_OWORD_4 ( temp, ! 3082: FCN_ADR_REGION0, 0, ! 3083: FCN_ADR_REGION1, ( 1 << 16 ), ! 3084: FCN_ADR_REGION2, ( 2 << 16 ), ! 3085: FCN_ADR_REGION3, ( 3 << 16 ) ); ! 3086: falcon_write ( efab, &temp, FCN_ADR_REGION_REG_KER ); ! 3087: ! 3088: EFAB_TRACE ( "Clearing filter and RSS tables\n" ); ! 3089: ! 3090: for ( offset = FCN_RX_FILTER_TBL0 ; ! 3091: offset < FCN_RX_RSS_INDIR_TBL_B0+0x800 ; ! 3092: offset += 0x10 ) { ! 3093: falcon_write ( efab, &blanko, offset ); ! 3094: } ! 3095: ! 3096: EFAB_TRACE ( "Wiping buffer tables\n" ); ! 3097: ! 3098: /* Notice the 8 byte access mode */ ! 3099: for ( offset = 0x2800000 ; ! 3100: offset < 0x3000000 ; ! 3101: offset += 0x8) { ! 3102: _falcon_writel ( efab, 0, offset ); ! 3103: _falcon_writel ( efab, 0, offset + 4 ); ! 3104: wmb(); ! 3105: } ! 3106: } ! 3107: ! 3108: static int ! 3109: falcon_reset ( struct efab_nic *efab ) ! 3110: { ! 3111: efab_oword_t glb_ctl_reg_ker; ! 3112: ! 3113: /* Initiate software reset */ ! 3114: EFAB_POPULATE_OWORD_6 ( glb_ctl_reg_ker, ! 3115: FCN_PCIE_CORE_RST_CTL, EXCLUDE_FROM_RESET, ! 3116: FCN_PCIE_NSTCK_RST_CTL, EXCLUDE_FROM_RESET, ! 3117: FCN_PCIE_SD_RST_CTL, EXCLUDE_FROM_RESET, ! 3118: FCN_EE_RST_CTL, EXCLUDE_FROM_RESET, ! 3119: FCN_EXT_PHY_RST_DUR, 0x7, /* 10ms */ ! 3120: FCN_SWRST, 1 ); ! 3121: ! 3122: falcon_write ( efab, &glb_ctl_reg_ker, FCN_GLB_CTL_REG_KER ); ! 3123: ! 3124: /* Allow 50ms for reset */ ! 3125: mdelay ( 50 ); ! 3126: ! 3127: /* Check for device reset complete */ ! 3128: falcon_read ( efab, &glb_ctl_reg_ker, FCN_GLB_CTL_REG_KER ); ! 3129: if ( EFAB_OWORD_FIELD ( glb_ctl_reg_ker, FCN_SWRST ) != 0 ) { ! 3130: EFAB_ERR ( "Reset failed\n" ); ! 3131: return -ETIMEDOUT; ! 3132: } ! 3133: ! 3134: if ( ( efab->pci_revision == FALCON_REV_B0 ) && !efab->is_asic ) { ! 3135: clear_b0_fpga_memories ( efab ); ! 3136: } ! 3137: ! 3138: return 0; ! 3139: } ! 3140: ! 3141: /** Offset of MAC address within EEPROM or Flash */ ! 3142: #define FALCON_MAC_ADDRESS_OFFSET 0x310 ! 3143: ! 3144: /* ! 3145: * Falcon EEPROM structure ! 3146: */ ! 3147: #define SF_NV_CONFIG_BASE 0x300 ! 3148: #define SF_NV_CONFIG_EXTRA 0xA0 ! 3149: ! 3150: struct falcon_nv_config_ver2 { ! 3151: uint16_t nports; ! 3152: uint8_t port0_phy_addr; ! 3153: uint8_t port0_phy_type; ! 3154: uint8_t port1_phy_addr; ! 3155: uint8_t port1_phy_type; ! 3156: uint16_t asic_sub_revision; ! 3157: uint16_t board_revision; ! 3158: uint8_t mac_location; ! 3159: }; ! 3160: ! 3161: struct falcon_nv_extra { ! 3162: uint16_t magicnumber; ! 3163: uint16_t structure_version; ! 3164: uint16_t checksum; ! 3165: union { ! 3166: struct falcon_nv_config_ver2 ver2; ! 3167: } ver_specific; ! 3168: }; ! 3169: ! 3170: #define BOARD_TYPE(_rev) (_rev >> 8) ! 3171: ! 3172: static void ! 3173: falcon_probe_nic_variant ( struct efab_nic *efab, struct pci_device *pci ) ! 3174: { ! 3175: efab_oword_t altera_build, nic_stat; ! 3176: int fpga_version; ! 3177: uint8_t revision; ! 3178: ! 3179: /* PCI revision */ ! 3180: pci_read_config_byte ( pci, PCI_CLASS_REVISION, &revision ); ! 3181: efab->pci_revision = revision; ! 3182: ! 3183: /* Asic vs FPGA */ ! 3184: falcon_read ( efab, &altera_build, FCN_ALTERA_BUILD_REG_KER ); ! 3185: fpga_version = EFAB_OWORD_FIELD ( altera_build, FCN_VER_ALL ); ! 3186: efab->is_asic = (fpga_version == 0); ! 3187: ! 3188: /* MAC and PCI type */ ! 3189: falcon_read ( efab, &nic_stat, FCN_NIC_STAT_REG ); ! 3190: if ( efab->pci_revision == FALCON_REV_B0 ) { ! 3191: efab->phy_10g = EFAB_OWORD_FIELD ( nic_stat, FCN_STRAP_10G ); ! 3192: } ! 3193: else if ( efab->is_asic ) { ! 3194: efab->phy_10g = EFAB_OWORD_FIELD ( nic_stat, FCN_STRAP_10G ); ! 3195: } ! 3196: else { ! 3197: int minor = EFAB_OWORD_FIELD ( altera_build, FCN_VER_MINOR ); ! 3198: efab->phy_10g = ( minor == 0x14 ); ! 3199: } ! 3200: } ! 3201: ! 3202: static void ! 3203: falcon_init_spi_device ( struct efab_nic *efab, struct spi_device *spi ) ! 3204: { ! 3205: /* Falcon's SPI interface only supports reads/writes of up to 16 bytes. ! 3206: * Reduce the nvs block size down to satisfy this - which means callers ! 3207: * should use the nvs_* functions rather than spi_*. */ ! 3208: if ( spi->nvs.block_size > FALCON_SPI_MAX_LEN ) ! 3209: spi->nvs.block_size = FALCON_SPI_MAX_LEN; ! 3210: ! 3211: spi->bus = &efab->spi_bus; ! 3212: efab->spi = spi; ! 3213: } ! 3214: ! 3215: static int ! 3216: falcon_probe_spi ( struct efab_nic *efab ) ! 3217: { ! 3218: efab_oword_t nic_stat, gpio_ctl, ee_vpd_cfg; ! 3219: int has_flash, has_eeprom, ad9bit; ! 3220: ! 3221: falcon_read ( efab, &nic_stat, FCN_NIC_STAT_REG ); ! 3222: falcon_read ( efab, &gpio_ctl, FCN_GPIO_CTL_REG_KER ); ! 3223: falcon_read ( efab, &ee_vpd_cfg, FCN_EE_VPD_CFG_REG ); ! 3224: ! 3225: /* determine if FLASH / EEPROM is present */ ! 3226: if ( ( efab->pci_revision >= FALCON_REV_B0 ) || efab->is_asic ) { ! 3227: has_flash = EFAB_OWORD_FIELD ( nic_stat, FCN_SF_PRST ); ! 3228: has_eeprom = EFAB_OWORD_FIELD ( nic_stat, FCN_EE_PRST ); ! 3229: } else { ! 3230: has_flash = EFAB_OWORD_FIELD ( gpio_ctl, FCN_FLASH_PRESENT ); ! 3231: has_eeprom = EFAB_OWORD_FIELD ( gpio_ctl, FCN_EEPROM_PRESENT ); ! 3232: } ! 3233: ad9bit = EFAB_OWORD_FIELD ( ee_vpd_cfg, FCN_EE_VPD_EN_AD9_MODE ); ! 3234: ! 3235: /* Configure the SPI and I2C bus */ ! 3236: efab->spi_bus.rw = falcon_spi_rw; ! 3237: init_i2c_bit_basher ( &efab->i2c_bb, &falcon_i2c_bit_ops ); ! 3238: ! 3239: /* Configure the EEPROM SPI device. Generally, an Atmel 25040 ! 3240: * (or similar) is used, but this is only possible if there is also ! 3241: * a flash device present to store the boot-time chip configuration. ! 3242: */ ! 3243: if ( has_eeprom ) { ! 3244: if ( has_flash && ad9bit ) ! 3245: init_at25040 ( &efab->spi_eeprom ); ! 3246: else ! 3247: init_mc25xx640 ( &efab->spi_eeprom ); ! 3248: falcon_init_spi_device ( efab, &efab->spi_eeprom ); ! 3249: } ! 3250: ! 3251: /* Configure the FLASH SPI device */ ! 3252: if ( has_flash ) { ! 3253: init_at25f1024 ( &efab->spi_flash ); ! 3254: falcon_init_spi_device ( efab, &efab->spi_flash ); ! 3255: } ! 3256: ! 3257: EFAB_LOG ( "flash is %s, EEPROM is %s%s\n", ! 3258: ( has_flash ? "present" : "absent" ), ! 3259: ( has_eeprom ? "present " : "absent" ), ! 3260: ( has_eeprom ? (ad9bit ? "(9bit)" : "(16bit)") : "") ); ! 3261: ! 3262: /* The device MUST have flash or eeprom */ ! 3263: if ( ! efab->spi ) { ! 3264: EFAB_ERR ( "Device appears to have no flash or eeprom\n" ); ! 3265: return -EIO; ! 3266: } ! 3267: ! 3268: /* If the device has EEPROM attached, then advertise NVO space */ ! 3269: if ( has_eeprom ) { ! 3270: nvo_init ( &efab->nvo, &efab->spi_eeprom.nvs, 0x100, 0xf0, ! 3271: NULL, &efab->netdev->refcnt ); ! 3272: } ! 3273: ! 3274: return 0; ! 3275: } ! 3276: ! 3277: static int ! 3278: falcon_probe_nvram ( struct efab_nic *efab ) ! 3279: { ! 3280: struct nvs_device *nvs = &efab->spi->nvs; ! 3281: struct falcon_nv_extra nv; ! 3282: int rc, board_revision; ! 3283: ! 3284: /* Read the MAC address */ ! 3285: rc = nvs_read ( nvs, FALCON_MAC_ADDRESS_OFFSET, ! 3286: efab->mac_addr, ETH_ALEN ); ! 3287: if ( rc ) ! 3288: return rc; ! 3289: ! 3290: /* Poke through the NVRAM structure for the PHY type. */ ! 3291: rc = nvs_read ( nvs, SF_NV_CONFIG_BASE + SF_NV_CONFIG_EXTRA, ! 3292: &nv, sizeof ( nv ) ); ! 3293: if ( rc ) ! 3294: return rc; ! 3295: ! 3296: /* Handle each supported NVRAM version */ ! 3297: if ( ( le16_to_cpu ( nv.magicnumber ) == FCN_NV_MAGIC_NUMBER ) && ! 3298: ( le16_to_cpu ( nv.structure_version ) >= 2 ) ) { ! 3299: struct falcon_nv_config_ver2* ver2 = &nv.ver_specific.ver2; ! 3300: ! 3301: /* Get the PHY type */ ! 3302: efab->phy_addr = le16_to_cpu ( ver2->port0_phy_addr ); ! 3303: efab->phy_type = le16_to_cpu ( ver2->port0_phy_type ); ! 3304: board_revision = le16_to_cpu ( ver2->board_revision ); ! 3305: } ! 3306: else { ! 3307: EFAB_ERR ( "NVram is not recognised\n" ); ! 3308: return -EINVAL; ! 3309: } ! 3310: ! 3311: efab->board_type = BOARD_TYPE ( board_revision ); ! 3312: ! 3313: EFAB_TRACE ( "Falcon board %d phy %d @ addr %d\n", ! 3314: efab->board_type, efab->phy_type, efab->phy_addr ); ! 3315: ! 3316: /* Patch in the board operations */ ! 3317: switch ( efab->board_type ) { ! 3318: case EFAB_BOARD_SFE4001: ! 3319: efab->board_op = &sfe4001_ops; ! 3320: break; ! 3321: case EFAB_BOARD_SFE4002: ! 3322: efab->board_op = &sfe4002_ops; ! 3323: break; ! 3324: case EFAB_BOARD_SFE4003: ! 3325: efab->board_op = &sfe4003_ops; ! 3326: break; ! 3327: default: ! 3328: EFAB_ERR ( "Unrecognised board type\n" ); ! 3329: return -EINVAL; ! 3330: } ! 3331: ! 3332: /* Patch in MAC operations */ ! 3333: if ( efab->phy_10g ) ! 3334: efab->mac_op = &falcon_xmac_operations; ! 3335: else ! 3336: efab->mac_op = &falcon_gmac_operations; ! 3337: ! 3338: /* Hook in the PHY ops */ ! 3339: switch ( efab->phy_type ) { ! 3340: case PHY_TYPE_10XPRESS: ! 3341: efab->phy_op = &falcon_tenxpress_phy_ops; ! 3342: break; ! 3343: case PHY_TYPE_CX4: ! 3344: efab->phy_op = &falcon_xaui_phy_ops; ! 3345: break; ! 3346: case PHY_TYPE_XFP: ! 3347: efab->phy_op = &falcon_xfp_phy_ops; ! 3348: break; ! 3349: case PHY_TYPE_CX4_RTMR: ! 3350: efab->phy_op = &falcon_txc_phy_ops; ! 3351: break; ! 3352: case PHY_TYPE_PM8358: ! 3353: efab->phy_op = &falcon_pm8358_phy_ops; ! 3354: break; ! 3355: case PHY_TYPE_1GIG_ALASKA: ! 3356: efab->phy_op = &falcon_alaska_phy_ops; ! 3357: break; ! 3358: default: ! 3359: EFAB_ERR ( "Unknown PHY type: %d\n", efab->phy_type ); ! 3360: return -EINVAL; ! 3361: } ! 3362: ! 3363: return 0; ! 3364: } ! 3365: ! 3366: static int ! 3367: falcon_init_sram ( struct efab_nic *efab ) ! 3368: { ! 3369: efab_oword_t reg; ! 3370: int count; ! 3371: ! 3372: /* use card in internal SRAM mode */ ! 3373: falcon_read ( efab, ®, FCN_NIC_STAT_REG ); ! 3374: EFAB_SET_OWORD_FIELD ( reg, FCN_ONCHIP_SRAM, 1 ); ! 3375: falcon_write ( efab, ®, FCN_NIC_STAT_REG ); ! 3376: ! 3377: /* Deactivate any external SRAM that might be present */ ! 3378: EFAB_POPULATE_OWORD_2 ( reg, ! 3379: FCN_GPIO1_OEN, 1, ! 3380: FCN_GPIO1_OUT, 1 ); ! 3381: falcon_write ( efab, ®, FCN_GPIO_CTL_REG_KER ); ! 3382: ! 3383: /* Initiate SRAM reset */ ! 3384: EFAB_POPULATE_OWORD_2 ( reg, ! 3385: FCN_SRAM_OOB_BT_INIT_EN, 1, ! 3386: FCN_SRM_NUM_BANKS_AND_BANK_SIZE, 0 ); ! 3387: falcon_write ( efab, ®, FCN_SRM_CFG_REG_KER ); ! 3388: ! 3389: /* Wait for SRAM reset to complete */ ! 3390: count = 0; ! 3391: do { ! 3392: /* SRAM reset is slow; expect around 16ms */ ! 3393: mdelay ( 20 ); ! 3394: ! 3395: /* Check for reset complete */ ! 3396: falcon_read ( efab, ®, FCN_SRM_CFG_REG_KER ); ! 3397: if ( !EFAB_OWORD_FIELD ( reg, FCN_SRAM_OOB_BT_INIT_EN ) ) ! 3398: return 0; ! 3399: } while (++count < 20); /* wait upto 0.4 sec */ ! 3400: ! 3401: EFAB_ERR ( "timed out waiting for SRAM reset\n"); ! 3402: return -ETIMEDOUT; ! 3403: } ! 3404: ! 3405: static void ! 3406: falcon_setup_nic ( struct efab_nic *efab ) ! 3407: { ! 3408: efab_dword_t timer_cmd; ! 3409: efab_oword_t reg; ! 3410: int tx_fc, xoff_thresh, xon_thresh; ! 3411: ! 3412: /* bug5129: Clear the parity enables on the TX data fifos as ! 3413: * they produce false parity errors because of timing issues ! 3414: */ ! 3415: falcon_read ( efab, ®, FCN_SPARE_REG_KER ); ! 3416: EFAB_SET_OWORD_FIELD ( reg, FCN_MEM_PERR_EN_TX_DATA, 0 ); ! 3417: falcon_write ( efab, ®, FCN_SPARE_REG_KER ); ! 3418: ! 3419: /* Set up TX and RX descriptor caches in SRAM */ ! 3420: EFAB_POPULATE_OWORD_1 ( reg, FCN_SRM_TX_DC_BASE_ADR, 0x130000 ); ! 3421: falcon_write ( efab, ®, FCN_SRM_TX_DC_CFG_REG_KER ); ! 3422: EFAB_POPULATE_OWORD_1 ( reg, FCN_TX_DC_SIZE, 1 /* 16 descriptors */ ); ! 3423: falcon_write ( efab, ®, FCN_TX_DC_CFG_REG_KER ); ! 3424: EFAB_POPULATE_OWORD_1 ( reg, FCN_SRM_RX_DC_BASE_ADR, 0x100000 ); ! 3425: falcon_write ( efab, ®, FCN_SRM_RX_DC_CFG_REG_KER ); ! 3426: EFAB_POPULATE_OWORD_1 ( reg, FCN_RX_DC_SIZE, 2 /* 32 descriptors */ ); ! 3427: falcon_write ( efab, ®, FCN_RX_DC_CFG_REG_KER ); ! 3428: ! 3429: /* Set number of RSS CPUs ! 3430: * bug7244: Increase filter depth to reduce RX_RESET likelyhood ! 3431: */ ! 3432: EFAB_POPULATE_OWORD_5 ( reg, ! 3433: FCN_NUM_KER, 0, ! 3434: FCN_UDP_FULL_SRCH_LIMIT, 8, ! 3435: FCN_UDP_WILD_SRCH_LIMIT, 8, ! 3436: FCN_TCP_WILD_SRCH_LIMIT, 8, ! 3437: FCN_TCP_FULL_SRCH_LIMIT, 8); ! 3438: falcon_write ( efab, ®, FCN_RX_FILTER_CTL_REG_KER ); ! 3439: udelay ( 1000 ); ! 3440: ! 3441: /* Setup RX. Wait for descriptor is broken and must ! 3442: * be disabled. RXDP recovery shouldn't be needed, but is. ! 3443: * disable ISCSI parsing because we don't need it ! 3444: */ ! 3445: falcon_read ( efab, ®, FCN_RX_SELF_RST_REG_KER ); ! 3446: EFAB_SET_OWORD_FIELD ( reg, FCN_RX_NODESC_WAIT_DIS, 1 ); ! 3447: EFAB_SET_OWORD_FIELD ( reg, FCN_RX_RECOVERY_EN, 1 ); ! 3448: EFAB_SET_OWORD_FIELD ( reg, FCN_RX_ISCSI_DIS, 1 ); ! 3449: falcon_write ( efab, ®, FCN_RX_SELF_RST_REG_KER ); ! 3450: ! 3451: /* Determine recommended flow control settings. * ! 3452: * Flow control is qualified on B0 and A1/1G, not on A1/10G */ ! 3453: if ( efab->pci_revision == FALCON_REV_B0 ) { ! 3454: tx_fc = 1; ! 3455: xoff_thresh = 54272; /* ~80Kb - 3*max MTU */ ! 3456: xon_thresh = 27648; /* ~3*max MTU */ ! 3457: } ! 3458: else if ( !efab->phy_10g ) { ! 3459: tx_fc = 1; ! 3460: xoff_thresh = 2048; ! 3461: xon_thresh = 512; ! 3462: } ! 3463: else { ! 3464: tx_fc = xoff_thresh = xon_thresh = 0; ! 3465: } ! 3466: ! 3467: /* Setup TX and RX */ ! 3468: falcon_read ( efab, ®, FCN_TX_CFG2_REG_KER ); ! 3469: EFAB_SET_OWORD_FIELD ( reg, FCN_TX_DIS_NON_IP_EV, 1 ); ! 3470: falcon_write ( efab, ®, FCN_TX_CFG2_REG_KER ); ! 3471: ! 3472: falcon_read ( efab, ®, FCN_RX_CFG_REG_KER ); ! 3473: EFAB_SET_OWORD_FIELD_VER ( efab, reg, FCN_RX_USR_BUF_SIZE, ! 3474: (3*4096) / 32 ); ! 3475: if ( efab->pci_revision == FALCON_REV_B0) ! 3476: EFAB_SET_OWORD_FIELD ( reg, FCN_RX_INGR_EN_B0, 1 ); ! 3477: EFAB_SET_OWORD_FIELD_VER ( efab, reg, FCN_RX_XON_MAC_TH, ! 3478: xon_thresh / 256); ! 3479: EFAB_SET_OWORD_FIELD_VER ( efab, reg, FCN_RX_XOFF_MAC_TH, ! 3480: xoff_thresh / 256); ! 3481: EFAB_SET_OWORD_FIELD_VER ( efab, reg, FCN_RX_XOFF_MAC_EN, tx_fc); ! 3482: falcon_write ( efab, ®, FCN_RX_CFG_REG_KER ); ! 3483: ! 3484: /* Set timer register */ ! 3485: EFAB_POPULATE_DWORD_2 ( timer_cmd, ! 3486: FCN_TIMER_MODE, FCN_TIMER_MODE_DIS, ! 3487: FCN_TIMER_VAL, 0 ); ! 3488: falcon_writel ( efab, &timer_cmd, FCN_TIMER_CMD_REG_KER ); ! 3489: } ! 3490: ! 3491: static void ! 3492: falcon_init_resources ( struct efab_nic *efab ) ! 3493: { ! 3494: struct efab_ev_queue *ev_queue = &efab->ev_queue; ! 3495: struct efab_rx_queue *rx_queue = &efab->rx_queue; ! 3496: struct efab_tx_queue *tx_queue = &efab->tx_queue; ! 3497: ! 3498: efab_oword_t reg; ! 3499: int jumbo; ! 3500: ! 3501: /* Initialise the ptrs */ ! 3502: tx_queue->read_ptr = tx_queue->write_ptr = 0; ! 3503: rx_queue->read_ptr = rx_queue->write_ptr = 0; ! 3504: ev_queue->read_ptr = 0; ! 3505: ! 3506: /* Push the event queue to the hardware */ ! 3507: EFAB_POPULATE_OWORD_3 ( reg, ! 3508: FCN_EVQ_EN, 1, ! 3509: FCN_EVQ_SIZE, FQS(FCN_EVQ, EFAB_EVQ_SIZE), ! 3510: FCN_EVQ_BUF_BASE_ID, ev_queue->entry.id ); ! 3511: falcon_write ( efab, ®, ! 3512: FCN_REVISION_REG ( efab, FCN_EVQ_PTR_TBL_KER ) ); ! 3513: ! 3514: /* Push the tx queue to the hardware */ ! 3515: EFAB_POPULATE_OWORD_8 ( reg, ! 3516: FCN_TX_DESCQ_EN, 1, ! 3517: FCN_TX_ISCSI_DDIG_EN, 0, ! 3518: FCN_TX_ISCSI_DDIG_EN, 0, ! 3519: FCN_TX_DESCQ_BUF_BASE_ID, tx_queue->entry.id, ! 3520: FCN_TX_DESCQ_EVQ_ID, 0, ! 3521: FCN_TX_DESCQ_SIZE, FQS(FCN_TX_DESCQ, EFAB_TXD_SIZE), ! 3522: FCN_TX_DESCQ_TYPE, 0 /* kernel queue */, ! 3523: FCN_TX_NON_IP_DROP_DIS_B0, 1 ); ! 3524: falcon_write ( efab, ®, ! 3525: FCN_REVISION_REG ( efab, FCN_TX_DESC_PTR_TBL_KER ) ); ! 3526: ! 3527: /* Push the rx queue to the hardware */ ! 3528: jumbo = ( efab->pci_revision == FALCON_REV_B0 ) ? 0 : 1; ! 3529: EFAB_POPULATE_OWORD_8 ( reg, ! 3530: FCN_RX_ISCSI_DDIG_EN, 0, ! 3531: FCN_RX_ISCSI_HDIG_EN, 0, ! 3532: FCN_RX_DESCQ_BUF_BASE_ID, rx_queue->entry.id, ! 3533: FCN_RX_DESCQ_EVQ_ID, 0, ! 3534: FCN_RX_DESCQ_SIZE, FQS(FCN_RX_DESCQ, EFAB_RXD_SIZE), ! 3535: FCN_RX_DESCQ_TYPE, 0 /* kernel queue */, ! 3536: FCN_RX_DESCQ_JUMBO, jumbo, ! 3537: FCN_RX_DESCQ_EN, 1 ); ! 3538: falcon_write ( efab, ®, ! 3539: FCN_REVISION_REG ( efab, FCN_RX_DESC_PTR_TBL_KER ) ); ! 3540: ! 3541: /* Program INT_ADR_REG_KER */ ! 3542: EFAB_POPULATE_OWORD_1 ( reg, ! 3543: FCN_INT_ADR_KER, virt_to_bus ( &efab->int_ker ) ); ! 3544: falcon_write ( efab, ®, FCN_INT_ADR_REG_KER ); ! 3545: ! 3546: /* Ack the event queue */ ! 3547: falcon_eventq_read_ack ( efab, ev_queue ); ! 3548: } ! 3549: ! 3550: static void ! 3551: falcon_fini_resources ( struct efab_nic *efab ) ! 3552: { ! 3553: efab_oword_t cmd; ! 3554: ! 3555: /* Disable interrupts */ ! 3556: falcon_interrupts ( efab, 0, 0 ); ! 3557: ! 3558: /* Flush the dma queues */ ! 3559: EFAB_POPULATE_OWORD_2 ( cmd, ! 3560: FCN_TX_FLUSH_DESCQ_CMD, 1, ! 3561: FCN_TX_FLUSH_DESCQ, 0 ); ! 3562: falcon_write ( efab, &cmd, ! 3563: FCN_REVISION_REG ( efab, FCN_TX_DESC_PTR_TBL_KER ) ); ! 3564: ! 3565: EFAB_POPULATE_OWORD_2 ( cmd, ! 3566: FCN_RX_FLUSH_DESCQ_CMD, 1, ! 3567: FCN_RX_FLUSH_DESCQ, 0 ); ! 3568: falcon_write ( efab, &cmd, ! 3569: FCN_REVISION_REG ( efab, FCN_RX_DESC_PTR_TBL_KER ) ); ! 3570: ! 3571: mdelay ( 100 ); ! 3572: ! 3573: /* Remove descriptor rings from card */ ! 3574: EFAB_ZERO_OWORD ( cmd ); ! 3575: falcon_write ( efab, &cmd, ! 3576: FCN_REVISION_REG ( efab, FCN_TX_DESC_PTR_TBL_KER ) ); ! 3577: falcon_write ( efab, &cmd, ! 3578: FCN_REVISION_REG ( efab, FCN_RX_DESC_PTR_TBL_KER ) ); ! 3579: falcon_write ( efab, &cmd, ! 3580: FCN_REVISION_REG ( efab, FCN_EVQ_PTR_TBL_KER ) ); ! 3581: } ! 3582: ! 3583: /******************************************************************************* ! 3584: * ! 3585: * ! 3586: * Hardware rx path ! 3587: * ! 3588: * ! 3589: *******************************************************************************/ ! 3590: ! 3591: static void ! 3592: falcon_build_rx_desc ( falcon_rx_desc_t *rxd, struct io_buffer *iob ) ! 3593: { ! 3594: EFAB_POPULATE_QWORD_2 ( *rxd, ! 3595: FCN_RX_KER_BUF_SIZE, EFAB_RX_BUF_SIZE, ! 3596: FCN_RX_KER_BUF_ADR, virt_to_bus ( iob->data ) ); ! 3597: } ! 3598: ! 3599: static void ! 3600: falcon_notify_rx_desc ( struct efab_nic *efab, struct efab_rx_queue *rx_queue ) ! 3601: { ! 3602: efab_dword_t reg; ! 3603: int ptr = rx_queue->write_ptr % EFAB_RXD_SIZE; ! 3604: ! 3605: EFAB_POPULATE_DWORD_1 ( reg, FCN_RX_DESC_WPTR_DWORD, ptr ); ! 3606: falcon_writel ( efab, ®, FCN_RX_DESC_UPD_REG_KER_DWORD ); ! 3607: } ! 3608: ! 3609: ! 3610: /******************************************************************************* ! 3611: * ! 3612: * ! 3613: * Hardware tx path ! 3614: * ! 3615: * ! 3616: *******************************************************************************/ ! 3617: ! 3618: static void ! 3619: falcon_build_tx_desc ( falcon_tx_desc_t *txd, struct io_buffer *iob ) ! 3620: { ! 3621: EFAB_POPULATE_QWORD_2 ( *txd, ! 3622: FCN_TX_KER_BYTE_CNT, iob_len ( iob ), ! 3623: FCN_TX_KER_BUF_ADR, virt_to_bus ( iob->data ) ); ! 3624: } ! 3625: ! 3626: static void ! 3627: falcon_notify_tx_desc ( struct efab_nic *efab, ! 3628: struct efab_tx_queue *tx_queue ) ! 3629: { ! 3630: efab_dword_t reg; ! 3631: int ptr = tx_queue->write_ptr % EFAB_TXD_SIZE; ! 3632: ! 3633: EFAB_POPULATE_DWORD_1 ( reg, FCN_TX_DESC_WPTR_DWORD, ptr ); ! 3634: falcon_writel ( efab, ®, FCN_TX_DESC_UPD_REG_KER_DWORD ); ! 3635: } ! 3636: ! 3637: ! 3638: /******************************************************************************* ! 3639: * ! 3640: * ! 3641: * Software receive interface ! 3642: * ! 3643: * ! 3644: *******************************************************************************/ ! 3645: ! 3646: static int ! 3647: efab_fill_rx_queue ( struct efab_nic *efab, ! 3648: struct efab_rx_queue *rx_queue ) ! 3649: { ! 3650: int fill_level = rx_queue->write_ptr - rx_queue->read_ptr; ! 3651: int space = EFAB_NUM_RX_DESC - fill_level - 1; ! 3652: int pushed = 0; ! 3653: ! 3654: while ( space ) { ! 3655: int buf_id = rx_queue->write_ptr % EFAB_NUM_RX_DESC; ! 3656: int desc_id = rx_queue->write_ptr % EFAB_RXD_SIZE; ! 3657: struct io_buffer *iob; ! 3658: falcon_rx_desc_t *rxd; ! 3659: ! 3660: assert ( rx_queue->buf[buf_id] == NULL ); ! 3661: iob = alloc_iob ( EFAB_RX_BUF_SIZE ); ! 3662: if ( !iob ) ! 3663: break; ! 3664: ! 3665: EFAB_TRACE ( "pushing rx_buf[%d] iob %p data %p\n", ! 3666: buf_id, iob, iob->data ); ! 3667: ! 3668: rx_queue->buf[buf_id] = iob; ! 3669: rxd = rx_queue->ring + desc_id; ! 3670: falcon_build_rx_desc ( rxd, iob ); ! 3671: ++rx_queue->write_ptr; ! 3672: ++pushed; ! 3673: --space; ! 3674: } ! 3675: ! 3676: if ( pushed ) { ! 3677: /* Push the ptr to hardware */ ! 3678: falcon_notify_rx_desc ( efab, rx_queue ); ! 3679: ! 3680: fill_level = rx_queue->write_ptr - rx_queue->read_ptr; ! 3681: EFAB_TRACE ( "pushed %d rx buffers to fill level %d\n", ! 3682: pushed, fill_level ); ! 3683: } ! 3684: ! 3685: if ( fill_level == 0 ) ! 3686: return -ENOMEM; ! 3687: return 0; ! 3688: } ! 3689: ! 3690: static void ! 3691: efab_receive ( struct efab_nic *efab, unsigned int id, int len, int drop ) ! 3692: { ! 3693: struct efab_rx_queue *rx_queue = &efab->rx_queue; ! 3694: struct io_buffer *iob; ! 3695: unsigned int read_ptr = rx_queue->read_ptr % EFAB_RXD_SIZE; ! 3696: unsigned int buf_ptr = rx_queue->read_ptr % EFAB_NUM_RX_DESC; ! 3697: ! 3698: assert ( id == read_ptr ); ! 3699: ! 3700: /* Pop this rx buffer out of the software ring */ ! 3701: iob = rx_queue->buf[buf_ptr]; ! 3702: rx_queue->buf[buf_ptr] = NULL; ! 3703: ! 3704: EFAB_TRACE ( "popping rx_buf[%d] iob %p data %p with %d bytes %s\n", ! 3705: id, iob, iob->data, len, drop ? "bad" : "ok" ); ! 3706: ! 3707: /* Pass the packet up if required */ ! 3708: if ( drop ) ! 3709: free_iob ( iob ); ! 3710: else { ! 3711: iob_put ( iob, len ); ! 3712: netdev_rx ( efab->netdev, iob ); ! 3713: } ! 3714: ! 3715: ++rx_queue->read_ptr; ! 3716: } ! 3717: ! 3718: /******************************************************************************* ! 3719: * ! 3720: * ! 3721: * Software transmit interface ! 3722: * ! 3723: * ! 3724: *******************************************************************************/ ! 3725: ! 3726: static int ! 3727: efab_transmit ( struct net_device *netdev, struct io_buffer *iob ) ! 3728: { ! 3729: struct efab_nic *efab = netdev_priv ( netdev ); ! 3730: struct efab_tx_queue *tx_queue = &efab->tx_queue; ! 3731: int fill_level, space; ! 3732: falcon_tx_desc_t *txd; ! 3733: int buf_id; ! 3734: ! 3735: fill_level = tx_queue->write_ptr - tx_queue->read_ptr; ! 3736: space = EFAB_TXD_SIZE - fill_level - 1; ! 3737: if ( space < 1 ) ! 3738: return -ENOBUFS; ! 3739: ! 3740: /* Save the iobuffer for later completion */ ! 3741: buf_id = tx_queue->write_ptr % EFAB_TXD_SIZE; ! 3742: assert ( tx_queue->buf[buf_id] == NULL ); ! 3743: tx_queue->buf[buf_id] = iob; ! 3744: ! 3745: EFAB_TRACE ( "tx_buf[%d] for iob %p data %p len %zd\n", ! 3746: buf_id, iob, iob->data, iob_len ( iob ) ); ! 3747: ! 3748: /* Form the descriptor, and push it to hardware */ ! 3749: txd = tx_queue->ring + buf_id; ! 3750: falcon_build_tx_desc ( txd, iob ); ! 3751: ++tx_queue->write_ptr; ! 3752: falcon_notify_tx_desc ( efab, tx_queue ); ! 3753: ! 3754: return 0; ! 3755: } ! 3756: ! 3757: static int ! 3758: efab_transmit_done ( struct efab_nic *efab, int id ) ! 3759: { ! 3760: struct efab_tx_queue *tx_queue = &efab->tx_queue; ! 3761: unsigned int read_ptr, stop; ! 3762: ! 3763: /* Complete all buffers from read_ptr up to and including id */ ! 3764: read_ptr = tx_queue->read_ptr % EFAB_TXD_SIZE; ! 3765: stop = ( id + 1 ) % EFAB_TXD_SIZE; ! 3766: ! 3767: while ( read_ptr != stop ) { ! 3768: struct io_buffer *iob = tx_queue->buf[read_ptr]; ! 3769: assert ( iob ); ! 3770: ! 3771: /* Complete the tx buffer */ ! 3772: if ( iob ) ! 3773: netdev_tx_complete ( efab->netdev, iob ); ! 3774: tx_queue->buf[read_ptr] = NULL; ! 3775: ! 3776: ++tx_queue->read_ptr; ! 3777: read_ptr = tx_queue->read_ptr % EFAB_TXD_SIZE; ! 3778: } ! 3779: ! 3780: return 0; ! 3781: } ! 3782: ! 3783: /******************************************************************************* ! 3784: * ! 3785: * ! 3786: * Hardware event path ! 3787: * ! 3788: * ! 3789: *******************************************************************************/ ! 3790: ! 3791: static void ! 3792: falcon_clear_interrupts ( struct efab_nic *efab ) ! 3793: { ! 3794: efab_dword_t reg; ! 3795: ! 3796: if ( efab->pci_revision == FALCON_REV_B0 ) { ! 3797: /* read the ISR */ ! 3798: falcon_readl( efab, ®, INT_ISR0_B0 ); ! 3799: } ! 3800: else { ! 3801: /* write to the INT_ACK register */ ! 3802: falcon_writel ( efab, 0, FCN_INT_ACK_KER_REG_A1 ); ! 3803: mb(); ! 3804: falcon_readl ( efab, ®, ! 3805: WORK_AROUND_BROKEN_PCI_READS_REG_KER_A1 ); ! 3806: } ! 3807: } ! 3808: ! 3809: static void ! 3810: falcon_handle_event ( struct efab_nic *efab, falcon_event_t *evt ) ! 3811: { ! 3812: int ev_code, desc_ptr, len, drop; ! 3813: ! 3814: /* Decode event */ ! 3815: ev_code = EFAB_QWORD_FIELD ( *evt, FCN_EV_CODE ); ! 3816: switch ( ev_code ) { ! 3817: case FCN_TX_IP_EV_DECODE: ! 3818: desc_ptr = EFAB_QWORD_FIELD ( *evt, FCN_TX_EV_DESC_PTR ); ! 3819: efab_transmit_done ( efab, desc_ptr ); ! 3820: break; ! 3821: ! 3822: case FCN_RX_IP_EV_DECODE: ! 3823: desc_ptr = EFAB_QWORD_FIELD ( *evt, FCN_RX_EV_DESC_PTR ); ! 3824: len = EFAB_QWORD_FIELD ( *evt, FCN_RX_EV_BYTE_CNT ); ! 3825: drop = !EFAB_QWORD_FIELD ( *evt, FCN_RX_EV_PKT_OK ); ! 3826: ! 3827: efab_receive ( efab, desc_ptr, len, drop ); ! 3828: break; ! 3829: ! 3830: default: ! 3831: EFAB_TRACE ( "Unknown event type %d\n", ev_code ); ! 3832: break; ! 3833: } ! 3834: } ! 3835: ! 3836: /******************************************************************************* ! 3837: * ! 3838: * ! 3839: * Software (polling) interrupt handler ! 3840: * ! 3841: * ! 3842: *******************************************************************************/ ! 3843: ! 3844: static void ! 3845: efab_poll ( struct net_device *netdev ) ! 3846: { ! 3847: struct efab_nic *efab = netdev_priv ( netdev ); ! 3848: struct efab_ev_queue *ev_queue = &efab->ev_queue; ! 3849: struct efab_rx_queue *rx_queue = &efab->rx_queue; ! 3850: falcon_event_t *evt; ! 3851: ! 3852: /* Read the event queue by directly looking for events ! 3853: * (we don't even bother to read the eventq write ptr) */ ! 3854: evt = ev_queue->ring + ev_queue->read_ptr; ! 3855: while ( falcon_event_present ( evt ) ) { ! 3856: ! 3857: EFAB_TRACE ( "Event at index 0x%x address %p is " ! 3858: EFAB_QWORD_FMT "\n", ev_queue->read_ptr, ! 3859: evt, EFAB_QWORD_VAL ( *evt ) ); ! 3860: ! 3861: falcon_handle_event ( efab, evt ); ! 3862: ! 3863: /* Clear the event */ ! 3864: EFAB_SET_QWORD ( *evt ); ! 3865: ! 3866: /* Move to the next event. We don't ack the event ! 3867: * queue until the end */ ! 3868: ev_queue->read_ptr = ( ( ev_queue->read_ptr + 1 ) % ! 3869: EFAB_EVQ_SIZE ); ! 3870: evt = ev_queue->ring + ev_queue->read_ptr; ! 3871: } ! 3872: ! 3873: /* Push more buffers if needed */ ! 3874: (void) efab_fill_rx_queue ( efab, rx_queue ); ! 3875: ! 3876: /* Clear any pending interrupts */ ! 3877: falcon_clear_interrupts ( efab ); ! 3878: ! 3879: /* Ack the event queue */ ! 3880: falcon_eventq_read_ack ( efab, ev_queue ); ! 3881: } ! 3882: ! 3883: static void ! 3884: efab_irq ( struct net_device *netdev, int enable ) ! 3885: { ! 3886: struct efab_nic *efab = netdev_priv ( netdev ); ! 3887: struct efab_ev_queue *ev_queue = &efab->ev_queue; ! 3888: ! 3889: switch ( enable ) { ! 3890: case 0: ! 3891: falcon_interrupts ( efab, 0, 0 ); ! 3892: break; ! 3893: case 1: ! 3894: falcon_interrupts ( efab, 1, 0 ); ! 3895: falcon_eventq_read_ack ( efab, ev_queue ); ! 3896: break; ! 3897: case 2: ! 3898: falcon_interrupts ( efab, 1, 1 ); ! 3899: break; ! 3900: } ! 3901: } ! 3902: ! 3903: /******************************************************************************* ! 3904: * ! 3905: * ! 3906: * Software open/close ! 3907: * ! 3908: * ! 3909: *******************************************************************************/ ! 3910: ! 3911: static void ! 3912: efab_free_resources ( struct efab_nic *efab ) ! 3913: { ! 3914: struct efab_ev_queue *ev_queue = &efab->ev_queue; ! 3915: struct efab_rx_queue *rx_queue = &efab->rx_queue; ! 3916: struct efab_tx_queue *tx_queue = &efab->tx_queue; ! 3917: int i; ! 3918: ! 3919: for ( i = 0; i < EFAB_NUM_RX_DESC; i++ ) { ! 3920: if ( rx_queue->buf[i] ) ! 3921: free_iob ( rx_queue->buf[i] ); ! 3922: } ! 3923: ! 3924: for ( i = 0; i < EFAB_TXD_SIZE; i++ ) { ! 3925: if ( tx_queue->buf[i] ) ! 3926: netdev_tx_complete ( efab->netdev, tx_queue->buf[i] ); ! 3927: } ! 3928: ! 3929: if ( rx_queue->ring ) ! 3930: falcon_free_special_buffer ( rx_queue->ring ); ! 3931: ! 3932: if ( tx_queue->ring ) ! 3933: falcon_free_special_buffer ( tx_queue->ring ); ! 3934: ! 3935: if ( ev_queue->ring ) ! 3936: falcon_free_special_buffer ( ev_queue->ring ); ! 3937: ! 3938: memset ( rx_queue, 0, sizeof ( *rx_queue ) ); ! 3939: memset ( tx_queue, 0, sizeof ( *tx_queue ) ); ! 3940: memset ( ev_queue, 0, sizeof ( *ev_queue ) ); ! 3941: ! 3942: /* Ensure subsequent buffer allocations start at id 0 */ ! 3943: efab->buffer_head = 0; ! 3944: } ! 3945: ! 3946: static int ! 3947: efab_alloc_resources ( struct efab_nic *efab ) ! 3948: { ! 3949: struct efab_ev_queue *ev_queue = &efab->ev_queue; ! 3950: struct efab_rx_queue *rx_queue = &efab->rx_queue; ! 3951: struct efab_tx_queue *tx_queue = &efab->tx_queue; ! 3952: size_t bytes; ! 3953: ! 3954: /* Allocate the hardware event queue */ ! 3955: bytes = sizeof ( falcon_event_t ) * EFAB_TXD_SIZE; ! 3956: ev_queue->ring = falcon_alloc_special_buffer ( efab, bytes, ! 3957: &ev_queue->entry ); ! 3958: if ( !ev_queue->ring ) ! 3959: goto fail1; ! 3960: ! 3961: /* Initialise the hardware event queue */ ! 3962: memset ( ev_queue->ring, 0xff, bytes ); ! 3963: ! 3964: /* Allocate the hardware tx queue */ ! 3965: bytes = sizeof ( falcon_tx_desc_t ) * EFAB_TXD_SIZE; ! 3966: tx_queue->ring = falcon_alloc_special_buffer ( efab, bytes, ! 3967: &tx_queue->entry ); ! 3968: if ( ! tx_queue->ring ) ! 3969: goto fail2; ! 3970: ! 3971: /* Allocate the hardware rx queue */ ! 3972: bytes = sizeof ( falcon_rx_desc_t ) * EFAB_RXD_SIZE; ! 3973: rx_queue->ring = falcon_alloc_special_buffer ( efab, bytes, ! 3974: &rx_queue->entry ); ! 3975: if ( ! rx_queue->ring ) ! 3976: goto fail3; ! 3977: ! 3978: return 0; ! 3979: ! 3980: fail3: ! 3981: falcon_free_special_buffer ( tx_queue->ring ); ! 3982: tx_queue->ring = NULL; ! 3983: fail2: ! 3984: falcon_free_special_buffer ( ev_queue->ring ); ! 3985: ev_queue->ring = NULL; ! 3986: fail1: ! 3987: return -ENOMEM; ! 3988: } ! 3989: ! 3990: static int ! 3991: efab_init_mac ( struct efab_nic *efab ) ! 3992: { ! 3993: int count, rc; ! 3994: ! 3995: /* This can take several seconds */ ! 3996: EFAB_LOG ( "Waiting for link..\n" ); ! 3997: for ( count=0; count<5; count++ ) { ! 3998: rc = efab->mac_op->init ( efab ); ! 3999: if ( rc ) { ! 4000: EFAB_ERR ( "Failed reinitialising MAC, error %s\n", ! 4001: strerror ( rc )); ! 4002: return rc; ! 4003: } ! 4004: ! 4005: /* Sleep for 2s to wait for the link to settle, either ! 4006: * because we want to use it, or because we're about ! 4007: * to reset the mac anyway ! 4008: */ ! 4009: sleep ( 2 ); ! 4010: ! 4011: if ( ! efab->link_up ) { ! 4012: EFAB_ERR ( "!\n" ); ! 4013: continue; ! 4014: } ! 4015: ! 4016: EFAB_LOG ( "\n%dMbps %s-duplex\n", ! 4017: ( efab->link_options & LPA_EF_10000 ? 10000 : ! 4018: ( efab->link_options & LPA_EF_1000 ? 1000 : ! 4019: ( efab->link_options & LPA_100 ? 100 : 10 ) ) ), ! 4020: ( efab->link_options & LPA_EF_DUPLEX ? ! 4021: "full" : "half" ) ); ! 4022: ! 4023: /* TODO: Move link state handling to the poll() routine */ ! 4024: netdev_link_up ( efab->netdev ); ! 4025: return 0; ! 4026: } ! 4027: ! 4028: EFAB_ERR ( "timed initialising MAC\n" ); ! 4029: return -ETIMEDOUT; ! 4030: } ! 4031: ! 4032: static void ! 4033: efab_close ( struct net_device *netdev ) ! 4034: { ! 4035: struct efab_nic *efab = netdev_priv ( netdev ); ! 4036: ! 4037: falcon_fini_resources ( efab ); ! 4038: efab_free_resources ( efab ); ! 4039: efab->board_op->fini ( efab ); ! 4040: falcon_reset ( efab ); ! 4041: } ! 4042: ! 4043: static int ! 4044: efab_open ( struct net_device *netdev ) ! 4045: { ! 4046: struct efab_nic *efab = netdev_priv ( netdev ); ! 4047: struct efab_rx_queue *rx_queue = &efab->rx_queue; ! 4048: int rc; ! 4049: ! 4050: rc = falcon_reset ( efab ); ! 4051: if ( rc ) ! 4052: goto fail1; ! 4053: ! 4054: rc = efab->board_op->init ( efab ); ! 4055: if ( rc ) ! 4056: goto fail2; ! 4057: ! 4058: rc = falcon_init_sram ( efab ); ! 4059: if ( rc ) ! 4060: goto fail3; ! 4061: ! 4062: /* Configure descriptor caches before pushing hardware queues */ ! 4063: falcon_setup_nic ( efab ); ! 4064: ! 4065: rc = efab_alloc_resources ( efab ); ! 4066: if ( rc ) ! 4067: goto fail4; ! 4068: ! 4069: falcon_init_resources ( efab ); ! 4070: ! 4071: /* Push rx buffers */ ! 4072: rc = efab_fill_rx_queue ( efab, rx_queue ); ! 4073: if ( rc ) ! 4074: goto fail5; ! 4075: ! 4076: /* Try and bring the interface up */ ! 4077: rc = efab_init_mac ( efab ); ! 4078: if ( rc ) ! 4079: goto fail6; ! 4080: ! 4081: return 0; ! 4082: ! 4083: fail6: ! 4084: fail5: ! 4085: efab_free_resources ( efab ); ! 4086: fail4: ! 4087: fail3: ! 4088: efab->board_op->fini ( efab ); ! 4089: fail2: ! 4090: falcon_reset ( efab ); ! 4091: fail1: ! 4092: return rc; ! 4093: } ! 4094: ! 4095: static struct net_device_operations efab_operations = { ! 4096: .open = efab_open, ! 4097: .close = efab_close, ! 4098: .transmit = efab_transmit, ! 4099: .poll = efab_poll, ! 4100: .irq = efab_irq, ! 4101: }; ! 4102: ! 4103: static void ! 4104: efab_remove ( struct pci_device *pci ) ! 4105: { ! 4106: struct net_device *netdev = pci_get_drvdata ( pci ); ! 4107: struct efab_nic *efab = netdev_priv ( netdev ); ! 4108: ! 4109: if ( efab->membase ) { ! 4110: falcon_reset ( efab ); ! 4111: ! 4112: iounmap ( efab->membase ); ! 4113: efab->membase = NULL; ! 4114: } ! 4115: ! 4116: if ( efab->nvo.nvs ) { ! 4117: unregister_nvo ( &efab->nvo ); ! 4118: efab->nvo.nvs = NULL; ! 4119: } ! 4120: ! 4121: unregister_netdev ( netdev ); ! 4122: netdev_nullify ( netdev ); ! 4123: netdev_put ( netdev ); ! 4124: } ! 4125: ! 4126: static int ! 4127: efab_probe ( struct pci_device *pci ) ! 4128: { ! 4129: struct net_device *netdev; ! 4130: struct efab_nic *efab; ! 4131: unsigned long mmio_start, mmio_len; ! 4132: int rc; ! 4133: ! 4134: /* Create the network adapter */ ! 4135: netdev = alloc_etherdev ( sizeof ( struct efab_nic ) ); ! 4136: if ( ! netdev ) { ! 4137: rc = -ENOMEM; ! 4138: goto fail1; ! 4139: } ! 4140: ! 4141: /* Initialise the network adapter, and initialise private storage */ ! 4142: netdev_init ( netdev, &efab_operations ); ! 4143: pci_set_drvdata ( pci, netdev ); ! 4144: netdev->dev = &pci->dev; ! 4145: ! 4146: efab = netdev_priv ( netdev ); ! 4147: memset ( efab, 0, sizeof ( *efab ) ); ! 4148: efab->netdev = netdev; ! 4149: ! 4150: /* Get iobase/membase */ ! 4151: mmio_start = pci_bar_start ( pci, PCI_BASE_ADDRESS_2 ); ! 4152: mmio_len = pci_bar_size ( pci, PCI_BASE_ADDRESS_2 ); ! 4153: efab->membase = ioremap ( mmio_start, mmio_len ); ! 4154: EFAB_TRACE ( "BAR of %lx bytes at phys %lx mapped at %p\n", ! 4155: mmio_len, mmio_start, efab->membase ); ! 4156: ! 4157: /* Enable the PCI device */ ! 4158: adjust_pci_device ( pci ); ! 4159: efab->iobase = pci->ioaddr & ~3; ! 4160: ! 4161: /* Determine the NIC variant */ ! 4162: falcon_probe_nic_variant ( efab, pci ); ! 4163: ! 4164: /* Read the SPI interface and determine the MAC address, ! 4165: * and the board and phy variant. Hook in the op tables */ ! 4166: rc = falcon_probe_spi ( efab ); ! 4167: if ( rc ) ! 4168: goto fail2; ! 4169: rc = falcon_probe_nvram ( efab ); ! 4170: if ( rc ) ! 4171: goto fail3; ! 4172: ! 4173: memcpy ( netdev->hw_addr, efab->mac_addr, ETH_ALEN ); ! 4174: ! 4175: rc = register_netdev ( netdev ); ! 4176: if ( rc ) ! 4177: goto fail4; ! 4178: netdev_link_up ( netdev ); ! 4179: ! 4180: /* Advertise non-volatile storage */ ! 4181: if ( efab->nvo.nvs ) { ! 4182: rc = register_nvo ( &efab->nvo, netdev_settings ( netdev ) ); ! 4183: if ( rc ) ! 4184: goto fail5; ! 4185: } ! 4186: ! 4187: EFAB_LOG ( "Found %s EtherFabric %s %s revision %d\n", pci->id->name, ! 4188: efab->is_asic ? "ASIC" : "FPGA", ! 4189: efab->phy_10g ? "10G" : "1G", ! 4190: efab->pci_revision ); ! 4191: ! 4192: return 0; ! 4193: ! 4194: fail5: ! 4195: unregister_netdev ( netdev ); ! 4196: fail4: ! 4197: fail3: ! 4198: fail2: ! 4199: iounmap ( efab->membase ); ! 4200: efab->membase = NULL; ! 4201: netdev_put ( netdev ); ! 4202: fail1: ! 4203: return rc; ! 4204: } ! 4205: ! 4206: ! 4207: static struct pci_device_id efab_nics[] = { ! 4208: PCI_ROM(0x1924, 0x0703, "falcon", "EtherFabric Falcon", 0), ! 4209: PCI_ROM(0x1924, 0x0710, "falconb0", "EtherFabric FalconB0", 0), ! 4210: }; ! 4211: ! 4212: struct pci_driver etherfabric_driver __pci_driver = { ! 4213: .ids = efab_nics, ! 4214: .id_count = sizeof ( efab_nics ) / sizeof ( efab_nics[0] ), ! 4215: .probe = efab_probe, ! 4216: .remove = efab_remove, ! 4217: }; ! 4218: ! 4219: /* ! 4220: * Local variables: ! 4221: * c-basic-offset: 8 ! 4222: * c-indent-level: 8 ! 4223: * tab-width: 8 ! 4224: * End: ! 4225: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.