Jeff Garzik | 32c8037 | 2005-10-25 01:56:48 -0400 | [diff] [blame] | 1 | /* Copyright 2001 Sun Microsystems (thockin@sun.com) */ |
| 2 | #include <stdio.h> |
Ben Hutchings | 5ba70c0 | 2011-11-01 16:48:31 +0000 | [diff] [blame] | 3 | #include "internal.h" |
Jeff Garzik | 32c8037 | 2005-10-25 01:56:48 -0400 | [diff] [blame] | 4 | |
| 5 | #define PCI_VENDOR_NATSEMI 0x100b |
| 6 | #define PCI_DEVICE_DP83815 0x0020 |
| 7 | #define NATSEMI_MAGIC (PCI_VENDOR_NATSEMI | \ |
| 8 | (PCI_DEVICE_DP83815<<16)) |
| 9 | |
| 10 | /* register indices in the ethtool_regs->data */ |
| 11 | #define REG_CR 0 |
| 12 | #define BIT_CR_TXE (1<<0) |
| 13 | #define BIT_CR_RXE (1<<2) |
| 14 | #define BIT_CR_RST (1<<8) |
| 15 | #define REG_CFG 1 |
| 16 | #define BIT_CFG_BEM (1<<0) |
| 17 | #define BIT_CFG_BROM_DIS (1<<2) |
| 18 | #define BIT_CFG_PHY_DIS (1<<9) |
| 19 | #define BIT_CFG_PHY_RST (1<<10) |
| 20 | #define BIT_CFG_EXT_PHY (1<<12) |
| 21 | #define BIT_CFG_ANEG_EN (1<<13) |
| 22 | #define BIT_CFG_ANEG_100 (1<<14) |
| 23 | #define BIT_CFG_ANEG_FDUP (1<<15) |
| 24 | #define BIT_CFG_PINT_ACEN (1<<17) |
| 25 | #define BIT_CFG_PHY_CFG (0x3f<<18) |
| 26 | #define BIT_CFG_ANEG_DN (1<<27) |
| 27 | #define BIT_CFG_POL (1<<28) |
| 28 | #define BIT_CFG_FDUP (1<<29) |
| 29 | #define BIT_CFG_SPEED100 (1<<30) |
| 30 | #define BIT_CFG_LNKSTS (1<<31) |
| 31 | |
| 32 | #define REG_MEAR 2 |
| 33 | #define REG_PTSCR 3 |
| 34 | #define BIT_PTSCR_EEBIST_FAIL (1<<0) |
| 35 | #define BIT_PTSCR_EELOAD_EN (1<<2) |
| 36 | #define BIT_PTSCR_RBIST_RXFFAIL (1<<3) |
| 37 | #define BIT_PTSCR_RBIST_TXFAIL (1<<4) |
| 38 | #define BIT_PTSCR_RBIST_RXFAIL (1<<5) |
| 39 | #define REG_ISR 4 |
| 40 | #define REG_IMR 5 |
| 41 | #define BIT_INTR_RXOK (1<<0) |
| 42 | #define NAME_INTR_RXOK "Rx Complete" |
| 43 | #define BIT_INTR_RXDESC (1<<1) |
| 44 | #define NAME_INTR_RXDESC "Rx Descriptor" |
| 45 | #define BIT_INTR_RXERR (1<<2) |
| 46 | #define NAME_INTR_RXERR "Rx Packet Error" |
| 47 | #define BIT_INTR_RXEARLY (1<<3) |
| 48 | #define NAME_INTR_RXEARLY "Rx Early Threshold" |
| 49 | #define BIT_INTR_RXIDLE (1<<4) |
| 50 | #define NAME_INTR_RXIDLE "Rx Idle" |
| 51 | #define BIT_INTR_RXORN (1<<5) |
| 52 | #define NAME_INTR_RXORN "Rx Overrun" |
| 53 | #define BIT_INTR_TXOK (1<<6) |
| 54 | #define NAME_INTR_TXOK "Tx Packet OK" |
| 55 | #define BIT_INTR_TXDESC (1<<7) |
| 56 | #define NAME_INTR_TXDESC "Tx Descriptor" |
| 57 | #define BIT_INTR_TXERR (1<<8) |
| 58 | #define NAME_INTR_TXERR "Tx Packet Error" |
| 59 | #define BIT_INTR_TXIDLE (1<<9) |
| 60 | #define NAME_INTR_TXIDLE "Tx Idle" |
| 61 | #define BIT_INTR_TXURN (1<<10) |
| 62 | #define NAME_INTR_TXURN "Tx Underrun" |
| 63 | #define BIT_INTR_MIB (1<<11) |
| 64 | #define NAME_INTR_MIB "MIB Service" |
| 65 | #define BIT_INTR_SWI (1<<12) |
| 66 | #define NAME_INTR_SWI "Software" |
| 67 | #define BIT_INTR_PME (1<<13) |
| 68 | #define NAME_INTR_PME "Power Management Event" |
| 69 | #define BIT_INTR_PHY (1<<14) |
| 70 | #define NAME_INTR_PHY "Phy" |
| 71 | #define BIT_INTR_HIBERR (1<<15) |
| 72 | #define NAME_INTR_HIBERR "High Bits Error" |
| 73 | #define BIT_INTR_RXSOVR (1<<16) |
| 74 | #define NAME_INTR_RXSOVR "Rx Status FIFO Overrun" |
| 75 | #define BIT_INTR_RTABT (1<<20) |
| 76 | #define NAME_INTR_RTABT "Received Target Abort" |
| 77 | #define BIT_INTR_RMABT (1<<20) |
| 78 | #define NAME_INTR_RMABT "Received Master Abort" |
| 79 | #define BIT_INTR_SSERR (1<<20) |
| 80 | #define NAME_INTR_SSERR "Signaled System Error" |
| 81 | #define BIT_INTR_DPERR (1<<20) |
| 82 | #define NAME_INTR_DPERR "Detected Parity Error" |
| 83 | #define BIT_INTR_RXRCMP (1<<20) |
| 84 | #define NAME_INTR_RXRCMP "Rx Reset Complete" |
| 85 | #define BIT_INTR_TXRCMP (1<<20) |
| 86 | #define NAME_INTR_TXRCMP "Tx Reset Complete" |
| 87 | #define REG_IER 6 |
| 88 | #define BIT_IER_IE (1<<0) |
| 89 | #define REG_TXDP 8 |
| 90 | #define REG_TXCFG 9 |
| 91 | #define BIT_TXCFG_DRTH (0x3f<<0) |
| 92 | #define BIT_TXCFG_FLTH (0x3f<<8) |
| 93 | #define BIT_TXCFG_MXDMA (0x7<<20) |
| 94 | #define BIT_TXCFG_ATP (1<<28) |
| 95 | #define BIT_TXCFG_MLB (1<<29) |
| 96 | #define BIT_TXCFG_HBI (1<<30) |
| 97 | #define BIT_TXCFG_CSI (1<<31) |
| 98 | #define REG_RXDP 12 |
| 99 | #define REG_RXCFG 13 |
| 100 | #define BIT_RXCFG_DRTH (0x1f<<1) |
| 101 | #define BIT_RXCFG_MXDMA (0x7<<20) |
| 102 | #define BIT_RXCFG_ALP (1<<27) |
| 103 | #define BIT_RXCFG_ATX (1<<28) |
| 104 | #define BIT_RXCFG_ARP (1<<30) |
| 105 | #define BIT_RXCFG_AEP (1<<31) |
| 106 | #define REG_CCSR 15 |
| 107 | #define BIT_CCSR_CLKRUN_EN (1<<0) |
| 108 | #define BIT_CCSR_PMEEN (1<<8) |
| 109 | #define BIT_CCSR_PMESTS (1<<15) |
| 110 | #define REG_WCSR 16 |
| 111 | #define BIT_WCSR_WKPHY (1<<0) |
| 112 | #define BIT_WCSR_WKUCP (1<<1) |
| 113 | #define BIT_WCSR_WKMCP (1<<2) |
| 114 | #define BIT_WCSR_WKBCP (1<<3) |
| 115 | #define BIT_WCSR_WKARP (1<<4) |
| 116 | #define BIT_WCSR_WKPAT0 (1<<5) |
| 117 | #define BIT_WCSR_WKPAT1 (1<<6) |
| 118 | #define BIT_WCSR_WKPAT2 (1<<7) |
| 119 | #define BIT_WCSR_WKPAT3 (1<<8) |
| 120 | #define BIT_WCSR_WKMAG (1<<9) |
| 121 | #define BIT_WCSR_MPSOE (1<<10) |
| 122 | #define BIT_WCSR_SOHACK (1<<20) |
| 123 | #define BIT_WCSR_PHYINT (1<<22) |
| 124 | #define BIT_WCSR_UCASTR (1<<23) |
| 125 | #define BIT_WCSR_MCASTR (1<<24) |
| 126 | #define BIT_WCSR_BCASTR (1<<25) |
| 127 | #define BIT_WCSR_ARPR (1<<26) |
| 128 | #define BIT_WCSR_PATM0 (1<<27) |
| 129 | #define BIT_WCSR_PATM1 (1<<28) |
| 130 | #define BIT_WCSR_PATM2 (1<<29) |
| 131 | #define BIT_WCSR_PATM3 (1<<30) |
| 132 | #define BIT_WCSR_MPR (1<<31) |
| 133 | #define REG_PCR 17 |
| 134 | #define BIT_PCR_PAUSE_CNT (0xffff<<0) |
| 135 | #define BIT_PCR_PSNEG (1<<21) |
| 136 | #define BIT_PCR_PS_RCVD (1<<22) |
| 137 | #define BIT_PCR_PS_DA (1<<29) |
| 138 | #define BIT_PCR_PSMCAST (1<<30) |
| 139 | #define BIT_PCR_PSEN (1<<31) |
| 140 | #define REG_RFCR 18 |
| 141 | #define BIT_RFCR_UHEN (1<<20) |
| 142 | #define BIT_RFCR_MHEN (1<<21) |
| 143 | #define BIT_RFCR_AARP (1<<22) |
| 144 | #define BIT_RFCR_APAT0 (1<<23) |
| 145 | #define BIT_RFCR_APAT1 (1<<24) |
| 146 | #define BIT_RFCR_APAT2 (1<<25) |
| 147 | #define BIT_RFCR_APAT3 (1<<26) |
| 148 | #define BIT_RFCR_APM (1<<27) |
| 149 | #define BIT_RFCR_AAU (1<<28) |
| 150 | #define BIT_RFCR_AAM (1<<29) |
| 151 | #define BIT_RFCR_AAB (1<<30) |
| 152 | #define BIT_RFCR_RFEN (1<<31) |
| 153 | #define REG_RFDR 19 |
| 154 | #define REG_BRAR 20 |
| 155 | #define BIT_BRAR_AUTOINC (1<<31) |
| 156 | #define REG_BRDR 21 |
| 157 | #define REG_SRR 22 |
| 158 | #define REG_MIBC 23 |
| 159 | #define BIT_MIBC_WRN (1<<0) |
| 160 | #define BIT_MIBC_FRZ (1<<1) |
| 161 | #define REG_MIB0 24 |
| 162 | #define REG_MIB1 25 |
| 163 | #define REG_MIB2 26 |
| 164 | #define REG_MIB3 27 |
| 165 | #define REG_MIB4 28 |
| 166 | #define REG_MIB5 29 |
| 167 | #define REG_MIB6 30 |
| 168 | #define REG_BMCR 32 |
| 169 | #define BIT_BMCR_FDUP (1<<8) |
| 170 | #define BIT_BMCR_ANRST (1<<9) |
| 171 | #define BIT_BMCR_ISOL (1<<10) |
| 172 | #define BIT_BMCR_PDOWN (1<<11) |
| 173 | #define BIT_BMCR_ANEN (1<<12) |
| 174 | #define BIT_BMCR_SPEED (1<<13) |
| 175 | #define BIT_BMCR_LOOP (1<<14) |
| 176 | #define BIT_BMCR_RST (1<<15) |
| 177 | #define REG_BMSR 33 |
| 178 | #define BIT_BMSR_JABBER (1<<1) |
| 179 | #define BIT_BMSR_LNK (1<<2) |
| 180 | #define BIT_BMSR_ANCAP (1<<3) |
| 181 | #define BIT_BMSR_RFAULT (1<<4) |
| 182 | #define BIT_BMSR_ANDONE (1<<5) |
| 183 | #define BIT_BMSR_PREAMBLE (1<<6) |
| 184 | #define BIT_BMSR_10HCAP (1<<11) |
| 185 | #define BIT_BMSR_10FCAP (1<<12) |
| 186 | #define BIT_BMSR_100HCAP (1<<13) |
| 187 | #define BIT_BMSR_100FCAP (1<<14) |
| 188 | #define BIT_BMSR_100T4CAP (1<<15) |
| 189 | #define REG_PHYIDR1 34 |
| 190 | #define REG_PHYIDR2 35 |
| 191 | #define BIT_PHYIDR2_OUILSB (0x3f<<10) |
| 192 | #define BIT_PHYIDR2_MODEL (0x3f<<4) |
| 193 | #define BIT_PHYIDR2_REV (0xf) |
| 194 | #define REG_ANAR 36 |
| 195 | #define BIT_ANAR_PROTO (0x1f<<0) |
| 196 | #define BIT_ANAR_10 (1<<5) |
| 197 | #define BIT_ANAR_10_FD (1<<6) |
| 198 | #define BIT_ANAR_TX (1<<7) |
| 199 | #define BIT_ANAR_TXFD (1<<8) |
| 200 | #define BIT_ANAR_T4 (1<<9) |
| 201 | #define BIT_ANAR_PAUSE (1<<10) |
| 202 | #define BIT_ANAR_RF (1<<13) |
| 203 | #define BIT_ANAR_NP (1<<15) |
| 204 | #define REG_ANLPAR 37 |
| 205 | #define BIT_ANLPAR_PROTO (0x1f<<0) |
| 206 | #define BIT_ANLPAR_10 (1<<5) |
| 207 | #define BIT_ANLPAR_10_FD (1<<6) |
| 208 | #define BIT_ANLPAR_TX (1<<7) |
| 209 | #define BIT_ANLPAR_TXFD (1<<8) |
| 210 | #define BIT_ANLPAR_T4 (1<<9) |
| 211 | #define BIT_ANLPAR_PAUSE (1<<10) |
| 212 | #define BIT_ANLPAR_RF (1<<13) |
| 213 | #define BIT_ANLPAR_ACK (1<<14) |
| 214 | #define BIT_ANLPAR_NP (1<<15) |
| 215 | #define REG_ANER 38 |
| 216 | #define BIT_ANER_LP_AN_ENABLE (1<<0) |
| 217 | #define BIT_ANER_PAGE_RX (1<<1) |
| 218 | #define BIT_ANER_NP_ABLE (1<<2) |
| 219 | #define BIT_ANER_LP_NP_ABLE (1<<3) |
| 220 | #define BIT_ANER_PDF (1<<4) |
| 221 | #define REG_ANNPTR 39 |
| 222 | #define REG_PHYSTS 48 |
| 223 | #define BIT_PHYSTS_LNK (1<<0) |
| 224 | #define BIT_PHYSTS_SPD10 (1<<1) |
| 225 | #define BIT_PHYSTS_FDUP (1<<2) |
| 226 | #define BIT_PHYSTS_LOOP (1<<3) |
| 227 | #define BIT_PHYSTS_ANDONE (1<<4) |
| 228 | #define BIT_PHYSTS_JABBER (1<<5) |
| 229 | #define BIT_PHYSTS_RF (1<<6) |
| 230 | #define BIT_PHYSTS_MINT (1<<7) |
| 231 | #define BIT_PHYSTS_FC (1<<11) |
| 232 | #define BIT_PHYSTS_POL (1<<12) |
| 233 | #define BIT_PHYSTS_RXERR (1<<13) |
| 234 | #define REG_MICR 49 |
| 235 | #define BIT_MICR_INTEN (1<<1) |
| 236 | #define REG_MISR 50 |
| 237 | #define BIT_MISR_MSK_RHF (1<<9) |
| 238 | #define BIT_MISR_MSK_FHF (1<<10) |
| 239 | #define BIT_MISR_MSK_ANC (1<<11) |
| 240 | #define BIT_MISR_MSK_RF (1<<12) |
| 241 | #define BIT_MISR_MSK_JAB (1<<13) |
| 242 | #define BIT_MISR_MSK_LNK (1<<14) |
| 243 | #define BIT_MISR_MINT (1<<15) |
| 244 | #define REG_PGSEL 51 |
| 245 | #define REG_FCSCR 52 |
| 246 | #define REG_RECR 53 |
| 247 | #define REG_PCSR 54 |
| 248 | #define BIT_PCSR_NRZI (1<<2) |
| 249 | #define BIT_PCSR_FORCE_100 (1<<5) |
| 250 | #define BIT_PCSR_SDOPT (1<<8) |
| 251 | #define BIT_PCSR_SDFORCE (1<<9) |
| 252 | #define BIT_PCSR_TQM (1<<10) |
| 253 | #define BIT_PCSR_CLK (1<<11) |
| 254 | #define BIT_PCSR_4B5B (1<<12) |
| 255 | #define REG_PHYCR 57 |
| 256 | #define BIT_PHYCR_PHYADDR (0x1f<<0) |
| 257 | #define BIT_PHYCR_PAUSE_STS (1<<7) |
| 258 | #define BIT_PHYCR_STRETCH (1<<8) |
| 259 | #define BIT_PHYCR_BIST (1<<9) |
| 260 | #define BIT_PHYCR_BIST_STAT (1<<10) |
| 261 | #define BIT_PHYCR_PSR15 (1<<11) |
| 262 | #define REG_TBTSCR 58 |
| 263 | #define BIT_TBTSCR_JAB (1<<0) |
| 264 | #define BIT_TBTSCR_BEAT (1<<1) |
| 265 | #define BIT_TBTSCR_AUTOPOL (1<<3) |
| 266 | #define BIT_TBTSCR_POL (1<<4) |
| 267 | #define BIT_TBTSCR_FPOL (1<<5) |
| 268 | #define BIT_TBTSCR_FORCE_10 (1<<6) |
| 269 | #define BIT_TBTSCR_PULSE (1<<7) |
| 270 | #define BIT_TBTSCR_LOOP (1<<8) |
| 271 | #define REG_PMDCSR 64 |
| 272 | #define REG_TSTDAT 65 |
| 273 | #define REG_DSPCFG 66 |
| 274 | #define REG_SDCFG 67 |
| 275 | #define REG_PMATCH0 68 |
| 276 | #define REG_PMATCH1 69 |
| 277 | #define REG_PMATCH2 70 |
| 278 | #define REG_PCOUNT0 71 |
| 279 | #define REG_PCOUNT1 72 |
| 280 | #define REG_SOPASS0 73 |
| 281 | #define REG_SOPASS1 74 |
| 282 | #define REG_SOPASS2 75 |
| 283 | |
| 284 | static void __print_intr(int d, int intr, const char *name, |
| 285 | const char *s1, const char *s2) |
| 286 | { |
| 287 | if ((d) & intr) |
| 288 | fprintf(stdout, " %s Interrupt: %s\n", name, s1); |
| 289 | else if (s2) |
| 290 | fprintf(stdout, " %s Interrupt: %s\n", name, s2); |
| 291 | } |
| 292 | |
| 293 | #define PRINT_INTR(d, i, s1, s2) do { \ |
| 294 | int intr = BIT_INTR_ ## i; \ |
| 295 | const char *name = NAME_INTR_ ## i; \ |
| 296 | __print_intr(d, intr, name, s1, s2); \ |
| 297 | } while (0) |
| 298 | |
| 299 | #define PRINT_INTRS(d, s1, s2) do { \ |
| 300 | PRINT_INTR((d), RXOK, s1, s2); \ |
| 301 | PRINT_INTR((d), RXDESC, s1, s2); \ |
| 302 | PRINT_INTR((d), RXERR, s1, s2); \ |
| 303 | PRINT_INTR((d), RXEARLY, s1, s2); \ |
| 304 | PRINT_INTR((d), RXIDLE, s1, s2); \ |
| 305 | PRINT_INTR((d), RXORN, s1, s2); \ |
| 306 | PRINT_INTR((d), TXOK, s1, s2); \ |
| 307 | PRINT_INTR((d), TXDESC, s1, s2); \ |
| 308 | PRINT_INTR((d), TXERR, s1, s2); \ |
| 309 | PRINT_INTR((d), TXIDLE, s1, s2); \ |
| 310 | PRINT_INTR((d), TXURN, s1, s2); \ |
| 311 | PRINT_INTR((d), MIB, s1, s2); \ |
| 312 | PRINT_INTR((d), SWI, s1, s2); \ |
| 313 | PRINT_INTR((d), PME, s1, s2); \ |
| 314 | PRINT_INTR((d), PHY, s1, s2); \ |
| 315 | PRINT_INTR((d), HIBERR, s1, s2); \ |
| 316 | PRINT_INTR((d), RXSOVR, s1, s2); \ |
| 317 | PRINT_INTR((d), RTABT, s1, s2); \ |
| 318 | PRINT_INTR((d), RMABT, s1, s2); \ |
| 319 | PRINT_INTR((d), SSERR, s1, s2); \ |
| 320 | PRINT_INTR((d), DPERR, s1, s2); \ |
| 321 | PRINT_INTR((d), RXRCMP, s1, s2); \ |
| 322 | PRINT_INTR((d), TXRCMP, s1, s2); \ |
| 323 | } while (0) |
| 324 | |
| 325 | int |
Maciej Żenczykowski | 710a414 | 2019-10-17 11:20:56 -0700 | [diff] [blame] | 326 | natsemi_dump_regs(struct ethtool_drvinfo *info maybe_unused, |
| 327 | struct ethtool_regs *regs) |
Jeff Garzik | 32c8037 | 2005-10-25 01:56:48 -0400 | [diff] [blame] | 328 | { |
| 329 | u32 *data = (u32 *)regs->data; |
| 330 | u32 tmp; |
| 331 | |
| 332 | fprintf(stdout, "Mac/BIU Registers\n"); |
| 333 | fprintf(stdout, "-----------------\n"); |
| 334 | |
| 335 | /* command register */ |
| 336 | fprintf(stdout, |
| 337 | "0x00: CR (Command): 0x%08x\n", |
| 338 | data[REG_CR]); |
| 339 | fprintf(stdout, |
| 340 | " Transmit %s\n" |
| 341 | " Receive %s\n", |
| 342 | data[REG_CR] & BIT_CR_TXE ? "Active" : "Idle", |
| 343 | data[REG_CR] & BIT_CR_RXE ? "Active" : "Idle"); |
| 344 | if (data[REG_CR] & BIT_CR_RST) fprintf(stdout, |
| 345 | " Reset In Progress\n"); |
| 346 | |
| 347 | /* configuration register */ |
| 348 | fprintf(stdout, |
| 349 | "0x04: CFG (Configuration): 0x%08x\n", |
| 350 | data[REG_CFG]); |
| 351 | fprintf(stdout, |
| 352 | " %s Endian\n" |
| 353 | " Boot ROM %s\n" |
| 354 | " Internal Phy %s\n" |
| 355 | " Phy Reset %s\n" |
| 356 | " External Phy %s\n" |
| 357 | " Default Auto-Negotiation %s, %s %s Mb %s Duplex\n" |
| 358 | " Phy Interrupt %sAuto-Cleared\n" |
| 359 | " Phy Configuration = 0x%02x\n" |
| 360 | " Auto-Negotiation %s\n" |
| 361 | " %s Polarity\n" |
| 362 | " %s Duplex\n" |
| 363 | " %d Mb/s\n" |
| 364 | " Link %s\n", |
| 365 | data[REG_CFG] & BIT_CFG_BEM ? "Big" : "Little", |
| 366 | data[REG_CFG] & BIT_CFG_BROM_DIS ? "Disabled" : "Enabled", |
| 367 | data[REG_CFG] & BIT_CFG_PHY_DIS ? "Disabled" : "Enabled", |
| 368 | data[REG_CFG] & BIT_CFG_PHY_RST ? "In Progress" : "Idle", |
| 369 | data[REG_CFG] & BIT_CFG_EXT_PHY ? "Enabled" : "Disabled", |
| 370 | data[REG_CFG] & BIT_CFG_ANEG_EN ? "Enabled" : "Disabled", |
| 371 | data[REG_CFG] & BIT_CFG_ANEG_EN ? "Advertise" : "Force", |
| 372 | data[REG_CFG] & BIT_CFG_ANEG_100 ? |
| 373 | (data[REG_CFG] & BIT_CFG_ANEG_EN ? "10/100" : "100") |
| 374 | : "10", |
| 375 | data[REG_CFG] & BIT_CFG_ANEG_FDUP ? |
| 376 | (data[REG_CFG] & BIT_CFG_ANEG_EN ? "Half/Full" : "Full") |
| 377 | : "Half", |
| 378 | data[REG_CFG] & BIT_CFG_PINT_ACEN ? "" : "Not ", |
| 379 | data[REG_CFG] & BIT_CFG_PHY_CFG >> 18, |
| 380 | data[REG_CFG] & BIT_CFG_ANEG_DN ? "Done" : "Not Done", |
| 381 | data[REG_CFG] & BIT_CFG_POL ? "Reversed" : "Normal", |
| 382 | data[REG_CFG] & BIT_CFG_FDUP ? "Full" : "Half", |
| 383 | data[REG_CFG] & BIT_CFG_SPEED100 ? 100 : 10, |
| 384 | data[REG_CFG] & BIT_CFG_LNKSTS ? "Up" : "Down"); |
| 385 | |
| 386 | /* EEPROM access register */ |
| 387 | fprintf(stdout, |
| 388 | "0x08: MEAR (EEPROM Access): 0x%08x\n", |
| 389 | data[REG_MEAR]); |
| 390 | |
| 391 | /* PCI test control register */ |
| 392 | fprintf(stdout, |
| 393 | "0x0c: PTSCR (PCI Test Control): 0x%08x\n", |
| 394 | data[REG_PTSCR]); |
| 395 | fprintf(stdout, |
| 396 | " EEPROM Self Test %s\n" |
| 397 | " Rx Filter Self Test %s\n" |
| 398 | " Tx FIFO Self Test %s\n" |
| 399 | " Rx FIFO Self Test %s\n", |
| 400 | data[REG_PTSCR] & BIT_PTSCR_EEBIST_FAIL ? "Failed" : "Passed", |
| 401 | data[REG_PTSCR] & BIT_PTSCR_RBIST_RXFFAIL ? "Failed" : "Passed", |
| 402 | data[REG_PTSCR] & BIT_PTSCR_RBIST_TXFAIL ? "Failed" : "Passed", |
| 403 | data[REG_PTSCR] & BIT_PTSCR_RBIST_RXFAIL ? "Failed" : "Passed"); |
| 404 | if (data[REG_PTSCR] & BIT_PTSCR_EELOAD_EN) fprintf(stdout, |
| 405 | " EEPROM Reload In Progress\n"); |
| 406 | |
| 407 | /* Interrupt status register */ |
| 408 | fprintf(stdout, |
| 409 | "0x10: ISR (Interrupt Status): 0x%08x\n", |
| 410 | data[REG_ISR]); |
| 411 | if (data[REG_ISR]) |
| 412 | PRINT_INTRS(data[REG_ISR], "Active", (char *)NULL); |
| 413 | else |
| 414 | fprintf(stdout, " No Interrupts Active\n"); |
| 415 | |
| 416 | /* Interrupt mask register */ |
| 417 | fprintf(stdout, |
| 418 | "0x14: IMR (Interrupt Mask): 0x%08x\n", |
| 419 | data[REG_IMR]); |
| 420 | PRINT_INTRS(data[REG_IMR], "Enabled", "Masked"); |
| 421 | |
| 422 | /* Interrupt enable register */ |
| 423 | fprintf(stdout, |
| 424 | "0x18: IER (Interrupt Enable): 0x%08x\n", |
| 425 | data[REG_IER]); |
| 426 | fprintf(stdout, |
| 427 | " Interrupts %s\n", |
| 428 | data[REG_IER] & BIT_IER_IE ? "Enabled" : "Disabled"); |
| 429 | |
| 430 | /* Tx descriptor pointer register */ |
| 431 | fprintf(stdout, |
| 432 | "0x20: TXDP (Tx Descriptor Pointer): 0x%08x\n", |
| 433 | data[REG_TXDP]); |
| 434 | |
| 435 | /* Tx configuration register */ |
| 436 | fprintf(stdout, |
| 437 | "0x24: TXCFG (Tx Config): 0x%08x\n", |
| 438 | data[REG_TXCFG]); |
| 439 | tmp = (data[REG_TXCFG] & BIT_TXCFG_MXDMA)>>20; |
| 440 | fprintf(stdout, |
Ville Skyttä | 500a9f4 | 2013-12-15 14:19:31 +0200 | [diff] [blame] | 441 | " Drain Threshold = %d bytes (%d)\n" |
| 442 | " Fill Threshold = %d bytes (%d)\n" |
Jeff Garzik | 32c8037 | 2005-10-25 01:56:48 -0400 | [diff] [blame] | 443 | " Max DMA Burst per Tx = %d bytes\n" |
| 444 | " Automatic Tx Padding %s\n" |
| 445 | " Mac Loopback %s\n" |
| 446 | " Heartbeat Ignore %s\n" |
| 447 | " Carrier Sense Ignore %s\n", |
| 448 | (data[REG_TXCFG] & BIT_TXCFG_DRTH) * 32, |
| 449 | data[REG_TXCFG] & BIT_TXCFG_DRTH, |
| 450 | ((data[REG_TXCFG] & BIT_TXCFG_FLTH)>>8) * 32, |
| 451 | data[REG_TXCFG] & BIT_TXCFG_FLTH, |
| 452 | tmp ? (1<<(tmp-1))*4 : 512, |
| 453 | data[REG_TXCFG] & BIT_TXCFG_ATP ? "Enabled" : "Disabled", |
| 454 | data[REG_TXCFG] & BIT_TXCFG_MLB ? "Enabled" : "Disabled", |
| 455 | data[REG_TXCFG] & BIT_TXCFG_HBI ? "Enabled" : "Disabled", |
| 456 | data[REG_TXCFG] & BIT_TXCFG_CSI ? "Enabled" : "Disabled"); |
| 457 | |
| 458 | |
| 459 | /* Rx descriptor pointer register */ |
| 460 | fprintf(stdout, |
| 461 | "0x30: RXDP (Rx Descriptor Pointer): 0x%08x\n", |
| 462 | data[REG_RXDP]); |
| 463 | |
| 464 | /* Rx configuration register */ |
| 465 | fprintf(stdout, |
| 466 | "0x34: RXCFG (Rx Config): 0x%08x\n", |
| 467 | data[REG_RXCFG]); |
| 468 | tmp = (data[REG_RXCFG] & BIT_RXCFG_MXDMA)>>20; |
| 469 | fprintf(stdout, |
Ville Skyttä | 500a9f4 | 2013-12-15 14:19:31 +0200 | [diff] [blame] | 470 | " Drain Threshold = %d bytes (%d)\n" |
Jeff Garzik | 32c8037 | 2005-10-25 01:56:48 -0400 | [diff] [blame] | 471 | " Max DMA Burst per Rx = %d bytes\n" |
| 472 | " Long Packets %s\n" |
| 473 | " Tx Packets %s\n" |
| 474 | " Runt Packets %s\n" |
| 475 | " Error Packets %s\n", |
| 476 | ((data[REG_RXCFG] & BIT_RXCFG_DRTH) >> 1) * 8, |
| 477 | (data[REG_RXCFG] & BIT_RXCFG_DRTH) >> 1, |
| 478 | tmp ? (1<<(tmp-1))*4 : 512, |
| 479 | data[REG_RXCFG] & BIT_RXCFG_ALP ? "Accepted" : "Rejected", |
| 480 | data[REG_RXCFG] & BIT_RXCFG_ATX ? "Accepted" : "Rejected", |
| 481 | data[REG_RXCFG] & BIT_RXCFG_ARP ? "Accepted" : "Rejected", |
| 482 | data[REG_RXCFG] & BIT_RXCFG_AEP ? "Accepted" : "Rejected"); |
| 483 | |
| 484 | /* CLKRUN control/status register */ |
| 485 | fprintf(stdout, |
| 486 | "0x3c: CCSR (CLKRUN Control/Status): 0x%08x\n", |
| 487 | data[REG_CCSR]); |
| 488 | fprintf(stdout, |
| 489 | " CLKRUNN %s\n" |
| 490 | " Power Management %s\n", |
| 491 | data[REG_CCSR] & BIT_CCSR_CLKRUN_EN ? "Enabled" : "Disabled", |
| 492 | data[REG_CCSR] & BIT_CCSR_PMEEN ? "Enabled" : "Disabled"); |
| 493 | if (data[REG_CCSR] & BIT_CCSR_PMESTS) fprintf(stdout, |
| 494 | " Power Management Event Pending\n"); |
| 495 | |
| 496 | /* WoL control/status register */ |
| 497 | fprintf(stdout, |
| 498 | "0x40: WCSR (Wake-on-LAN Control/Status): 0x%08x\n", |
| 499 | data[REG_WCSR]); |
| 500 | if (data[REG_WCSR] & BIT_WCSR_WKPHY) fprintf(stdout, |
| 501 | " Wake on Phy Interrupt Enabled\n"); |
| 502 | if (data[REG_WCSR] & BIT_WCSR_WKUCP) fprintf(stdout, |
| 503 | " Wake on Unicast Packet Enabled\n"); |
| 504 | if (data[REG_WCSR] & BIT_WCSR_WKMCP) fprintf(stdout, |
| 505 | " Wake on Multicast Packet Enabled\n"); |
| 506 | if (data[REG_WCSR] & BIT_WCSR_WKBCP) fprintf(stdout, |
| 507 | " Wake on Broadcast Packet Enabled\n"); |
| 508 | if (data[REG_WCSR] & BIT_WCSR_WKARP) fprintf(stdout, |
| 509 | " Wake on Arp Enabled\n"); |
| 510 | if (data[REG_WCSR] & BIT_WCSR_WKPAT0) fprintf(stdout, |
| 511 | " Wake on Pattern 0 Match Enabled\n"); |
| 512 | if (data[REG_WCSR] & BIT_WCSR_WKPAT1) fprintf(stdout, |
| 513 | " Wake on Pattern 1 Match Enabled\n"); |
| 514 | if (data[REG_WCSR] & BIT_WCSR_WKPAT2) fprintf(stdout, |
| 515 | " Wake on Pattern 2 Match Enabled\n"); |
| 516 | if (data[REG_WCSR] & BIT_WCSR_WKPAT3) fprintf(stdout, |
| 517 | " Wake on Pattern 3 Match Enabled\n"); |
| 518 | if (data[REG_WCSR] & BIT_WCSR_WKMAG) fprintf(stdout, |
| 519 | " Wake on Magic Packet Enabled\n"); |
| 520 | if (data[REG_WCSR] & BIT_WCSR_MPSOE) fprintf(stdout, |
| 521 | " Magic Packet SecureOn Enabled\n"); |
| 522 | if (data[REG_WCSR] & BIT_WCSR_SOHACK) fprintf(stdout, |
| 523 | " SecureOn Hack Detected\n"); |
| 524 | if (data[REG_WCSR] & BIT_WCSR_PHYINT) fprintf(stdout, |
| 525 | " Phy Interrupt Received\n"); |
| 526 | if (data[REG_WCSR] & BIT_WCSR_UCASTR) fprintf(stdout, |
| 527 | " Unicast Packet Received\n"); |
| 528 | if (data[REG_WCSR] & BIT_WCSR_MCASTR) fprintf(stdout, |
| 529 | " Multicast Packet Received\n"); |
| 530 | if (data[REG_WCSR] & BIT_WCSR_BCASTR) fprintf(stdout, |
| 531 | " Broadcast Packet Received\n"); |
| 532 | if (data[REG_WCSR] & BIT_WCSR_ARPR) fprintf(stdout, |
| 533 | " Arp Received\n"); |
| 534 | if (data[REG_WCSR] & BIT_WCSR_PATM0) fprintf(stdout, |
| 535 | " Pattern 0 Received\n"); |
| 536 | if (data[REG_WCSR] & BIT_WCSR_PATM1) fprintf(stdout, |
| 537 | " Pattern 1 Received\n"); |
| 538 | if (data[REG_WCSR] & BIT_WCSR_PATM2) fprintf(stdout, |
| 539 | " Pattern 2 Received\n"); |
| 540 | if (data[REG_WCSR] & BIT_WCSR_PATM3) fprintf(stdout, |
| 541 | " Pattern 3 Received\n"); |
| 542 | if (data[REG_WCSR] & BIT_WCSR_MPR) fprintf(stdout, |
| 543 | " Magic Packet Received\n"); |
| 544 | |
| 545 | /* Pause control/status register */ |
| 546 | fprintf(stdout, |
| 547 | "0x44: PCR (Pause Control/Status): 0x%08x\n", |
| 548 | data[REG_PCR]); |
| 549 | fprintf(stdout, |
| 550 | " Pause Counter = %d\n" |
| 551 | " Pause %sNegotiated\n" |
| 552 | " Pause on DA %s\n" |
| 553 | " Pause on Mulitcast %s\n" |
| 554 | " Pause %s\n", |
| 555 | data[REG_PCR] & BIT_PCR_PAUSE_CNT, |
| 556 | data[REG_PCR] & BIT_PCR_PSNEG ? "" : "Not ", |
| 557 | data[REG_PCR] & BIT_PCR_PS_DA ? "Enabled" : "Disabled", |
| 558 | data[REG_PCR] & BIT_PCR_PSMCAST ? "Enabled" : "Disabled", |
| 559 | data[REG_PCR] & BIT_PCR_PSEN ? "Enabled" : "Disabled"); |
| 560 | if (data[REG_PCR] & BIT_PCR_PS_RCVD) fprintf(stdout, |
| 561 | " PS_RCVD: Pause Frame Received\n"); |
| 562 | |
| 563 | /* Rx Filter Control */ |
| 564 | fprintf(stdout, |
| 565 | "0x48: RFCR (Rx Filter Control): 0x%08x\n", |
| 566 | data[REG_RFCR]); |
| 567 | fprintf(stdout, |
| 568 | " Unicast Hash %s\n" |
| 569 | " Multicast Hash %s\n" |
| 570 | " Arp %s\n" |
| 571 | " Pattern 0 Match %s\n" |
| 572 | " Pattern 1 Match %s\n" |
| 573 | " Pattern 2 Match %s\n" |
| 574 | " Pattern 3 Match %s\n" |
| 575 | " Perfect Match %s\n" |
| 576 | " All Unicast %s\n" |
| 577 | " All Multicast %s\n" |
| 578 | " All Broadcast %s\n" |
| 579 | " Rx Filter %s\n", |
| 580 | data[REG_RFCR] & BIT_RFCR_UHEN ? "Enabled" : "Disabled", |
| 581 | data[REG_RFCR] & BIT_RFCR_MHEN ? "Enabled" : "Disabled", |
| 582 | data[REG_RFCR] & BIT_RFCR_AARP ? "Accepted" : "Rejected", |
| 583 | data[REG_RFCR] & BIT_RFCR_APAT0 ? "Accepted" : "Rejected", |
| 584 | data[REG_RFCR] & BIT_RFCR_APAT1 ? "Accepted" : "Rejected", |
| 585 | data[REG_RFCR] & BIT_RFCR_APAT2 ? "Accepted" : "Rejected", |
| 586 | data[REG_RFCR] & BIT_RFCR_APAT3 ? "Accepted" : "Rejected", |
| 587 | data[REG_RFCR] & BIT_RFCR_APM ? "Accepted" : "Rejected", |
| 588 | data[REG_RFCR] & BIT_RFCR_AAU ? "Accepted" : "Rejected", |
| 589 | data[REG_RFCR] & BIT_RFCR_AAM ? "Accepted" : "Rejected", |
| 590 | data[REG_RFCR] & BIT_RFCR_AAB ? "Accepted" : "Rejected", |
| 591 | data[REG_RFCR] & BIT_RFCR_RFEN ? "Enabled" : "Disabled"); |
| 592 | |
| 593 | /* Rx filter data register */ |
| 594 | fprintf(stdout, |
| 595 | "0x4c: RFDR (Rx Filter Data): 0x%08x\n", |
| 596 | data[REG_RFDR]); |
| 597 | if (regs->version >= 1) fprintf(stdout, |
| 598 | " PMATCH 1-0 = 0x%08x\n" |
| 599 | " PMATCH 3-2 = 0x%08x\n" |
| 600 | " PMATCH 5-4 = 0x%08x\n" |
| 601 | " PCOUNT 1-0 = 0x%08x\n" |
| 602 | " PCOUNT 3-2 = 0x%08x\n" |
| 603 | " SOPASS 1-0 = 0x%08x\n" |
| 604 | " SOPASS 3-2 = 0x%08x\n" |
| 605 | " SOPASS 5-4 = 0x%08x\n", |
| 606 | data[REG_PMATCH0], data[REG_PMATCH1], data[REG_PMATCH2], |
| 607 | data[REG_PCOUNT0], data[REG_PCOUNT1], |
| 608 | data[REG_SOPASS0], data[REG_SOPASS1], data[REG_SOPASS2]); |
| 609 | |
| 610 | |
| 611 | /* Boot ROM address register */ |
| 612 | fprintf(stdout, |
| 613 | "0x50: BRAR (Boot ROM Address): 0x%08x\n", |
| 614 | data[REG_BRAR]); |
| 615 | if (data[REG_BRAR] & BIT_BRAR_AUTOINC) fprintf(stdout, |
| 616 | " Automatically Increment Address\n"); |
| 617 | |
| 618 | /* Boot ROM data register */ |
| 619 | fprintf(stdout, |
| 620 | "0x54: BRDR (Boot ROM Data): 0x%08x\n", |
| 621 | data[REG_BRDR]); |
| 622 | |
| 623 | /* Silicon revison register */ |
| 624 | fprintf(stdout, |
| 625 | "0x58: SRR (Silicon Revision): 0x%08x\n", |
| 626 | data[REG_SRR]); |
| 627 | |
| 628 | /* Management information base control register */ |
| 629 | fprintf(stdout, |
| 630 | "0x5c: MIBC (Mgmt Info Base Control): 0x%08x\n", |
| 631 | data[REG_MIBC]); |
| 632 | if (data[REG_MIBC] & BIT_MIBC_WRN) fprintf(stdout, |
| 633 | " Counter Overflow Warning\n"); |
| 634 | if (data[REG_MIBC] & BIT_MIBC_FRZ) fprintf(stdout, |
| 635 | " Counters Frozen\n"); |
| 636 | |
| 637 | /* MIB registers */ |
| 638 | fprintf(stdout, |
| 639 | "0x60: MIB[0] (Rx Errored Packets): 0x%04x\n", |
| 640 | data[REG_MIB0]); |
| 641 | fprintf(stdout, " Value = %d\n", data[REG_MIB0]); |
| 642 | fprintf(stdout, |
| 643 | "0x64: MIB[1] (Rx Frame Sequence Errors): 0x%02x\n", |
| 644 | data[REG_MIB1]); |
| 645 | fprintf(stdout, " Value = %d\n", data[REG_MIB1]); |
| 646 | fprintf(stdout, |
| 647 | "0x68: MIB[2] (Rx Missed Packets): 0x%02x\n", |
| 648 | data[REG_MIB2]); |
| 649 | fprintf(stdout, " Value = %d\n", data[REG_MIB2]); |
| 650 | fprintf(stdout, |
| 651 | "0x6c: MIB[3] (Rx Alignment Errors): 0x%02x\n", |
| 652 | data[REG_MIB3]); |
| 653 | fprintf(stdout, " Value = %d\n", data[REG_MIB3]); |
| 654 | fprintf(stdout, |
| 655 | "0x70: MIB[4] (Rx Symbol Errors): 0x%02x\n", |
| 656 | data[REG_MIB4]); |
| 657 | fprintf(stdout, " Value = %d\n", data[REG_MIB4]); |
| 658 | fprintf(stdout, |
| 659 | "0x74: MIB[5] (Rx Long Frame Errors): 0x%02x\n", |
| 660 | data[REG_MIB5]); |
| 661 | fprintf(stdout, " Value = %d\n", data[REG_MIB5]); |
| 662 | fprintf(stdout, |
| 663 | "0x78: MIB[6] (Tx Heartbeat Errors): 0x%02x\n", |
| 664 | data[REG_MIB6]); |
| 665 | fprintf(stdout, " Value = %d\n", data[REG_MIB6]); |
| 666 | |
| 667 | fprintf(stdout, "\n"); |
| 668 | fprintf(stdout, "Internal Phy Registers\n"); |
| 669 | fprintf(stdout, "----------------------\n"); |
| 670 | |
| 671 | /* Basic mode control register */ |
| 672 | fprintf(stdout, |
| 673 | "0x80: BMCR (Basic Mode Control): 0x%04x\n", |
| 674 | data[REG_BMCR]); |
| 675 | fprintf(stdout, |
| 676 | " %s Duplex\n" |
| 677 | " Port is Powered %s\n" |
| 678 | " Auto-Negotiation %s\n" |
| 679 | " %d Mb/s\n", |
| 680 | data[REG_BMCR] & BIT_BMCR_FDUP ? "Full" : "Half", |
| 681 | data[REG_BMCR] & BIT_BMCR_PDOWN ? "Down" : "Up", |
| 682 | data[REG_BMCR] & BIT_BMCR_ANEN ? "Enabled" : "Disabled", |
| 683 | data[REG_BMCR] & BIT_BMCR_SPEED ? 100 : 10); |
| 684 | if (data[REG_BMCR] & BIT_BMCR_ANRST) fprintf(stdout, |
| 685 | " Auto-Negotiation Restarting\n"); |
| 686 | if (data[REG_BMCR] & BIT_BMCR_ISOL) fprintf(stdout, |
| 687 | " Port Isolated\n"); |
| 688 | if (data[REG_BMCR] & BIT_BMCR_LOOP) fprintf(stdout, |
| 689 | " Loopback Enabled\n"); |
| 690 | if (data[REG_BMCR] & BIT_BMCR_RST) fprintf(stdout, |
| 691 | " Reset In Progress\n"); |
| 692 | |
| 693 | /* Basic mode status register */ |
| 694 | fprintf(stdout, |
| 695 | "0x84: BMSR (Basic Mode Status): 0x%04x\n", |
| 696 | data[REG_BMSR]); |
| 697 | fprintf(stdout, |
| 698 | " Link %s\n" |
| 699 | " %sCapable of Auto-Negotiation\n" |
| 700 | " Auto-Negotiation %sComplete\n" |
| 701 | " %sCapable of Preamble Suppression\n" |
| 702 | " %sCapable of 10Base-T Half Duplex\n" |
| 703 | " %sCapable of 10Base-T Full Duplex\n" |
| 704 | " %sCapable of 100Base-TX Half Duplex\n" |
| 705 | " %sCapable of 100Base-TX Full Duplex\n" |
| 706 | " %sCapable of 100Base-T4\n", |
| 707 | data[REG_BMSR] & BIT_BMSR_LNK ? "Up" : "Down", |
| 708 | data[REG_BMSR] & BIT_BMSR_ANCAP ? "" : "Not ", |
| 709 | data[REG_BMSR] & BIT_BMSR_ANDONE ? "" : "Not ", |
| 710 | data[REG_BMSR] & BIT_BMSR_PREAMBLE ? "" : "Not ", |
| 711 | data[REG_BMSR] & BIT_BMSR_10HCAP ? "" : "Not ", |
| 712 | data[REG_BMSR] & BIT_BMSR_10FCAP ? "" : "Not ", |
| 713 | data[REG_BMSR] & BIT_BMSR_100HCAP ? "" : "Not ", |
| 714 | data[REG_BMSR] & BIT_BMSR_100FCAP ? "" : "Not ", |
| 715 | data[REG_BMSR] & BIT_BMSR_100T4CAP ? "" : "Not "); |
| 716 | if (data[REG_BMSR] & BIT_BMSR_JABBER) fprintf(stdout, |
| 717 | " Jabber Condition Detected\n"); |
| 718 | if (data[REG_BMSR] & BIT_BMSR_RFAULT) fprintf(stdout, |
| 719 | " Remote Fault Detected\n"); |
| 720 | |
| 721 | /* PHY identification registers */ |
| 722 | fprintf(stdout, |
| 723 | "0x88: PHYIDR1 (PHY ID #1): 0x%04x\n", |
| 724 | data[REG_PHYIDR1]); |
| 725 | fprintf(stdout, |
| 726 | "0x8c: PHYIDR2 (PHY ID #2): 0x%04x\n", |
| 727 | data[REG_PHYIDR2]); |
| 728 | fprintf(stdout, |
| 729 | " OUI = 0x%06x\n" |
| 730 | " Model = 0x%02x (%d)\n" |
| 731 | " Revision = 0x%01x (%d)\n", |
| 732 | (data[REG_PHYIDR1] << 6) | (data[REG_PHYIDR2] >> 10), |
| 733 | (data[REG_PHYIDR2] & BIT_PHYIDR2_MODEL) >> 4 & 0x3f, |
| 734 | (data[REG_PHYIDR2] & BIT_PHYIDR2_MODEL) >> 4 & 0x3f, |
| 735 | data[REG_PHYIDR2] & BIT_PHYIDR2_REV, |
| 736 | data[REG_PHYIDR2] & BIT_PHYIDR2_REV); |
| 737 | |
| 738 | /* autonegotiation advertising register */ |
| 739 | fprintf(stdout, |
| 740 | "0x90: ANAR (Autoneg Advertising): 0x%04x\n", |
| 741 | data[REG_ANAR]); |
| 742 | fprintf(stdout, |
| 743 | " Protocol Selector = 0x%02x (%d)\n", |
| 744 | data[REG_ANAR] & BIT_ANAR_PROTO, |
| 745 | data[REG_ANAR] & BIT_ANAR_PROTO); |
| 746 | if (data[REG_ANAR] & BIT_ANAR_10) fprintf(stdout, |
| 747 | " Advertising 10Base-T Half Duplex\n"); |
| 748 | if (data[REG_ANAR] & BIT_ANAR_10_FD) fprintf(stdout, |
| 749 | " Advertising 10Base-T Full Duplex\n"); |
| 750 | if (data[REG_ANAR] & BIT_ANAR_TX) fprintf(stdout, |
| 751 | " Advertising 100Base-TX Half Duplex\n"); |
| 752 | if (data[REG_ANAR] & BIT_ANAR_TXFD) fprintf(stdout, |
| 753 | " Advertising 100Base-TX Full Duplex\n"); |
| 754 | if (data[REG_ANAR] & BIT_ANAR_T4) fprintf(stdout, |
| 755 | " Advertising 100Base-T4\n"); |
| 756 | if (data[REG_ANAR] & BIT_ANAR_PAUSE) fprintf(stdout, |
| 757 | " Advertising Pause\n"); |
| 758 | if (data[REG_ANAR] & BIT_ANAR_RF) fprintf(stdout, |
| 759 | " Indicating Remote Fault\n"); |
| 760 | if (data[REG_ANAR] & BIT_ANAR_NP) fprintf(stdout, |
| 761 | " Next Page Desired\n"); |
| 762 | |
| 763 | /* Autonegotiation link partner ability register */ |
| 764 | fprintf(stdout, |
| 765 | "0x94: ANLPAR (Autoneg Partner): 0x%04x\n", |
| 766 | data[REG_ANLPAR]); |
| 767 | fprintf(stdout, |
| 768 | " Protocol Selector = 0x%02x (%d)\n", |
| 769 | data[REG_ANLPAR] & BIT_ANLPAR_PROTO, |
| 770 | data[REG_ANLPAR] & BIT_ANLPAR_PROTO); |
| 771 | if (data[REG_ANLPAR] & BIT_ANLPAR_10) fprintf(stdout, |
| 772 | " Supports 10Base-T Half Duplex\n"); |
| 773 | if (data[REG_ANLPAR] & BIT_ANLPAR_10_FD) fprintf(stdout, |
| 774 | " Supports 10Base-T Full Duplex\n"); |
| 775 | if (data[REG_ANLPAR] & BIT_ANLPAR_TX) fprintf(stdout, |
| 776 | " Supports 100Base-TX Half Duplex\n"); |
| 777 | if (data[REG_ANLPAR] & BIT_ANLPAR_TXFD) fprintf(stdout, |
| 778 | " Supports 100Base-TX Full Duplex\n"); |
| 779 | if (data[REG_ANLPAR] & BIT_ANLPAR_T4) fprintf(stdout, |
| 780 | " Supports 100Base-T4\n"); |
| 781 | if (data[REG_ANLPAR] & BIT_ANLPAR_PAUSE) fprintf(stdout, |
| 782 | " Supports Pause\n"); |
| 783 | if (data[REG_ANLPAR] & BIT_ANLPAR_RF) fprintf(stdout, |
| 784 | " Indicates Remote Fault\n"); |
| 785 | if (data[REG_ANLPAR] & BIT_ANLPAR_ACK) fprintf(stdout, |
| 786 | " Indicates Acknowledgement\n"); |
| 787 | if (data[REG_ANLPAR] & BIT_ANLPAR_NP) fprintf(stdout, |
| 788 | " Next Page Desired\n"); |
| 789 | |
| 790 | /* Autonegotiation expansion register */ |
| 791 | fprintf(stdout, |
| 792 | "0x98: ANER (Autoneg Expansion): 0x%04x\n", |
| 793 | data[REG_ANER]); |
| 794 | fprintf(stdout, |
| 795 | " Link Partner Can %sAuto-Negotiate\n" |
| 796 | " Link Code Word %sReceived\n" |
| 797 | " Next Page %sSupported\n" |
| 798 | " Link Partner Next Page %sSupported\n", |
| 799 | data[REG_ANER] & BIT_ANER_LP_AN_ENABLE ? "" : "Not ", |
| 800 | data[REG_ANER] & BIT_ANER_PAGE_RX ? "" : "Not ", |
| 801 | data[REG_ANER] & BIT_ANER_NP_ABLE ? "" : "Not ", |
| 802 | data[REG_ANER] & BIT_ANER_LP_NP_ABLE ? "" : "Not "); |
| 803 | if (data[REG_ANER] & BIT_ANER_PDF) fprintf(stdout, |
| 804 | " Parallel Detection Fault\n"); |
| 805 | |
| 806 | /* Autonegotiation next-page tx register */ |
| 807 | fprintf(stdout, |
| 808 | "0x9c: ANNPTR (Autoneg Next Page Tx): 0x%04x\n", |
| 809 | data[REG_ANNPTR]); |
| 810 | |
| 811 | /* Phy status register */ |
| 812 | fprintf(stdout, |
| 813 | "0xc0: PHYSTS (Phy Status): 0x%04x\n", |
| 814 | data[REG_PHYSTS]); |
| 815 | fprintf(stdout, |
| 816 | " Link %s\n" |
| 817 | " %d Mb/s\n" |
| 818 | " %s Duplex\n" |
| 819 | " Auto-Negotiation %sComplete\n" |
| 820 | " %s Polarity\n", |
| 821 | data[REG_PHYSTS] & BIT_PHYSTS_LNK ? "Up" : "Down", |
| 822 | data[REG_PHYSTS] & BIT_PHYSTS_SPD10 ? 10 : 100, |
| 823 | data[REG_PHYSTS] & BIT_PHYSTS_FDUP ? "Full" : "Half", |
| 824 | data[REG_PHYSTS] & BIT_PHYSTS_ANDONE ? "" : "Not ", |
| 825 | data[REG_PHYSTS] & BIT_PHYSTS_POL ? "Reverse" : "Normal"); |
| 826 | if (data[REG_PHYSTS] & BIT_PHYSTS_LOOP) fprintf(stdout, |
| 827 | " Loopback Enabled\n"); |
| 828 | if (data[REG_PHYSTS] & BIT_PHYSTS_JABBER) fprintf(stdout, |
| 829 | " Jabber Condition Detected\n"); |
| 830 | if (data[REG_PHYSTS] & BIT_PHYSTS_RF) fprintf(stdout, |
| 831 | " Remote Fault Detected\n"); |
| 832 | if (data[REG_PHYSTS] & BIT_PHYSTS_MINT) fprintf(stdout, |
| 833 | " MII Interrupt Detected\n"); |
| 834 | if (data[REG_PHYSTS] & BIT_PHYSTS_FC) fprintf(stdout, |
| 835 | " False Carrier Detected\n"); |
| 836 | if (data[REG_PHYSTS] & BIT_PHYSTS_RXERR) fprintf(stdout, |
| 837 | " Rx Error Detected\n"); |
| 838 | |
| 839 | fprintf(stdout, |
| 840 | "0xc4: MICR (MII Interrupt Control): 0x%04x\n", |
| 841 | data[REG_MICR]); |
| 842 | fprintf(stdout, |
| 843 | " MII Interrupts %s\n", |
| 844 | data[REG_MICR] & BIT_MICR_INTEN ? "Enabled" : "Disabled"); |
| 845 | |
| 846 | fprintf(stdout, |
| 847 | "0xc8: MISR (MII Interrupt Status): 0x%04x\n", |
| 848 | data[REG_MISR]); |
| 849 | fprintf(stdout, |
| 850 | " Rx Error Counter Half-Full Interrupt %s\n" |
| 851 | " False Carrier Counter Half-Full Interrupt %s\n" |
| 852 | " Auto-Negotiation Complete Interrupt %s\n" |
| 853 | " Remote Fault Interrupt %s\n" |
| 854 | " Jabber Interrupt %s\n" |
| 855 | " Link Change Interrupt %s\n", |
| 856 | data[REG_MISR] & BIT_MISR_MSK_RHF ? "Masked" : "Enabled", |
| 857 | data[REG_MISR] & BIT_MISR_MSK_FHF ? "Masked" : "Enabled", |
| 858 | data[REG_MISR] & BIT_MISR_MSK_ANC ? "Masked" : "Enabled", |
| 859 | data[REG_MISR] & BIT_MISR_MSK_RF ? "Masked" : "Enabled", |
| 860 | data[REG_MISR] & BIT_MISR_MSK_JAB ? "Masked" : "Enabled", |
| 861 | data[REG_MISR] & BIT_MISR_MSK_LNK ? "Masked" : "Enabled"); |
| 862 | if (data[REG_MISR] & BIT_MISR_MINT) fprintf(stdout, |
| 863 | " MII Interrupt Pending\n"); |
| 864 | |
| 865 | /* Page select register (from section of spec on 'suggested values') */ |
| 866 | fprintf(stdout, |
| 867 | "0xcc: PGSEL (Phy Register Page Select): 0x%04x\n", |
| 868 | data[REG_PGSEL]); |
| 869 | |
| 870 | /* counters */ |
| 871 | fprintf(stdout, |
| 872 | "0xd0: FCSCR (False Carrier Counter): 0x%04x\n", |
| 873 | data[REG_FCSCR]); |
| 874 | fprintf(stdout, |
| 875 | " Value = %d\n", data[REG_FCSCR] & 0xff); |
| 876 | fprintf(stdout, |
| 877 | "0xd4: RECR (Rx Error Counter): 0x%04x\n", |
| 878 | data[REG_RECR]); |
| 879 | fprintf(stdout, |
| 880 | " Value = %d\n", data[REG_RECR] & 0xff); |
| 881 | |
| 882 | /* 100 Mbit configuration register */ |
| 883 | fprintf(stdout, |
| 884 | "0xd8: PCSR (100Mb/s PCS Config/Status): 0x%04x\n", |
| 885 | data[REG_PCSR]); |
| 886 | fprintf(stdout, |
| 887 | " NRZI Bypass %s\n" |
| 888 | " %s Signal Detect Algorithm\n" |
| 889 | " %s Signal Detect Operation\n" |
| 890 | " True Quiet Mode %s\n" |
| 891 | " Rx Clock is %s\n" |
| 892 | " 4B/5B Operation %s\n", |
| 893 | data[REG_PCSR] & BIT_PCSR_NRZI ? "Enabled" : "Disabled", |
| 894 | data[REG_PCSR] & BIT_PCSR_SDOPT ? "Enhanced" : "Reduced", |
| 895 | data[REG_PCSR] & BIT_PCSR_SDFORCE ? "Forced" : "Normal", |
| 896 | data[REG_PCSR] & BIT_PCSR_TQM ? "Enabled" : "Disabled", |
| 897 | data[REG_PCSR] & BIT_PCSR_CLK ? |
| 898 | "Free-Running" : "Phase-Adjusted", |
| 899 | data[REG_PCSR] & BIT_PCSR_4B5B ? "Bypassed" : "Normal"); |
| 900 | if (data[REG_PCSR] & BIT_PCSR_FORCE_100) fprintf(stdout, |
| 901 | " Forced 100 Mb/s Good Link\n"); |
| 902 | |
| 903 | /* Phy control register */ |
| 904 | fprintf(stdout, |
| 905 | "0xe4: PHYCR (Phy Control): 0x%04x\n", |
| 906 | data[REG_PHYCR]); |
| 907 | fprintf(stdout, |
| 908 | " Phy Address = 0x%x (%d)\n" |
| 909 | " %sPause Compatible with Link Partner\n" |
| 910 | " LED Stretching %s\n" |
| 911 | " Phy Self Test %s\n" |
| 912 | " Self Test Sequence = PSR%d\n", |
| 913 | data[REG_PHYCR] & BIT_PHYCR_PHYADDR, |
| 914 | data[REG_PHYCR] & BIT_PHYCR_PHYADDR, |
| 915 | data[REG_PHYCR] & BIT_PHYCR_PAUSE_STS ? "" : "Not ", |
| 916 | data[REG_PHYCR] & BIT_PHYCR_STRETCH ? "Bypassed" : "Enabled", |
| 917 | data[REG_PHYCR] & BIT_PHYCR_BIST ? "In Progress" : |
| 918 | data[REG_PHYCR] & BIT_PHYCR_BIST_STAT ? |
| 919 | "Passed" : "Failed or Not Run", |
| 920 | data[REG_PHYCR] & BIT_PHYCR_PSR15 ? 15 : 9); |
| 921 | |
| 922 | |
| 923 | /* 10 Mbit control and status register */ |
| 924 | fprintf(stdout, |
| 925 | "0xe8: TBTSCR (10Base-T Status/Control): 0x%04x\n", |
| 926 | data[REG_TBTSCR]); |
| 927 | fprintf(stdout, |
| 928 | " Jabber %s\n" |
| 929 | " Heartbeat %s\n" |
| 930 | " Polarity Auto-Sense/Correct %s\n" |
| 931 | " %s Polarity %s\n" |
| 932 | " Normal Link Pulse %s\n" |
| 933 | " 10 Mb/s Loopback %s\n", |
| 934 | data[REG_TBTSCR] & BIT_TBTSCR_JAB ? "Disabled" : "Enabled", |
| 935 | data[REG_TBTSCR] & BIT_TBTSCR_BEAT ? "Disabled" : "Enabled", |
| 936 | data[REG_TBTSCR] & BIT_TBTSCR_AUTOPOL ? "Disabled" : "Enabled", |
| 937 | data[REG_TBTSCR] & BIT_TBTSCR_AUTOPOL ? |
| 938 | data[REG_TBTSCR]&BIT_TBTSCR_FPOL ? "Reverse":"Normal" : |
| 939 | data[REG_TBTSCR]&BIT_TBTSCR_POL ? "Reverse":"Normal", |
| 940 | data[REG_TBTSCR] & BIT_TBTSCR_AUTOPOL ? "Forced" : "Detected", |
| 941 | data[REG_TBTSCR] & BIT_TBTSCR_PULSE ? "Disabled" : "Enabled", |
| 942 | data[REG_TBTSCR] & BIT_TBTSCR_LOOP ? "Enabled" : "Disabled"); |
| 943 | if (data[REG_TBTSCR] & BIT_TBTSCR_FORCE_10) fprintf(stdout, |
| 944 | " Forced 10 Mb/s Good Link\n"); |
| 945 | |
| 946 | /* the spec says to set these */ |
| 947 | fprintf(stdout, "\n"); |
| 948 | fprintf(stdout, "'Magic' Phy Registers\n"); |
| 949 | fprintf(stdout, "---------------------\n"); |
| 950 | fprintf(stdout, |
| 951 | "0xe4: PMDCSR: 0x%04x\n", |
| 952 | data[REG_PMDCSR]); |
| 953 | fprintf(stdout, |
| 954 | "0xf4: DSPCFG: 0x%04x\n", |
| 955 | data[REG_DSPCFG]); |
| 956 | fprintf(stdout, |
| 957 | "0xf8: SDCFG: 0x%04x\n", |
| 958 | data[REG_SDCFG]); |
| 959 | fprintf(stdout, |
| 960 | "0xfc: TSTDAT: 0x%04x\n", |
| 961 | data[REG_TSTDAT]); |
| 962 | |
| 963 | return 0; |
| 964 | } |
| 965 | |
| 966 | int |
Maciej Żenczykowski | 967177c | 2019-10-17 11:20:57 -0700 | [diff] [blame] | 967 | natsemi_dump_eeprom(struct ethtool_drvinfo *info maybe_unused, |
| 968 | struct ethtool_eeprom *ee) |
Jeff Garzik | 32c8037 | 2005-10-25 01:56:48 -0400 | [diff] [blame] | 969 | { |
| 970 | int i; |
| 971 | u16 *eebuf = (u16 *)ee->data; |
| 972 | |
| 973 | if (ee->magic != NATSEMI_MAGIC) { |
| 974 | fprintf(stderr, "Magic number 0x%08x does not match 0x%08x\n", |
| 975 | ee->magic, NATSEMI_MAGIC); |
| 976 | return -1; |
| 977 | } |
| 978 | |
| 979 | fprintf(stdout, "Address\tData\n"); |
| 980 | fprintf(stdout, "-------\t------\n"); |
| 981 | for (i = 0; i < ee->len/2; i++) { |
| 982 | fprintf(stdout, "0x%02x \t0x%04x\n", i + ee->offset, eebuf[i]); |
| 983 | } |
| 984 | |
| 985 | return 0; |
| 986 | } |
| 987 | |