Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'lan743x-Add-features-to-lan743x-driver'

Bryan Whitehead says:

====================
lan743x: Add features to lan743x driver

This patch series adds extra features to the lan743x driver.

Updates for v4:
Patch 6/8 - Modified get/set_wol to use super set of
MAC and PHY driver support.
Patch 7/9 - In set_eee, return the return value from phy_ethtool_set_eee.

Updates for v3:
Removed patch 9 from this series, regarding PTP support
Patch 6/8 - Add call to phy_ethtool_get_wol to lan743x_ethtool_get_wol
Patch 7/8 - Add call to phy_ethtool_set_eee on (!eee->eee_enabled)

Updates for v2:
Patch 3/9 - Used ARRAY_SIZE macro in lan743x_ethtool_get_ethtool_stats.
Patch 5/9 - Used MAX_EEPROM_SIZE in lan743x_ethtool_set_eeprom.
Patch 6/9 - Removed unnecessary read of PMT_CTL.
Used CRC algorithm from lib.
Removed PHY interrupt settings from lan743x_pm_suspend
Change "#if CONFIG_PM" to "#ifdef CONFIG_PM"
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+1042 -4
+1 -1
drivers/net/ethernet/microchip/Makefile
··· 6 6 obj-$(CONFIG_ENCX24J600) += encx24j600.o encx24j600-regmap.o 7 7 obj-$(CONFIG_LAN743X) += lan743x.o 8 8 9 - lan743x-objs := lan743x_main.o 9 + lan743x-objs := lan743x_main.o lan743x_ethtool.o
+696
drivers/net/ethernet/microchip/lan743x_ethtool.c
··· 1 + /* SPDX-License-Identifier: GPL-2.0+ */ 2 + /* Copyright (C) 2018 Microchip Technology Inc. */ 3 + 4 + #include <linux/netdevice.h> 5 + #include "lan743x_main.h" 6 + #include "lan743x_ethtool.h" 7 + #include <linux/pci.h> 8 + #include <linux/phy.h> 9 + 10 + /* eeprom */ 11 + #define LAN743X_EEPROM_MAGIC (0x74A5) 12 + #define LAN743X_OTP_MAGIC (0x74F3) 13 + #define EEPROM_INDICATOR_1 (0xA5) 14 + #define EEPROM_INDICATOR_2 (0xAA) 15 + #define EEPROM_MAC_OFFSET (0x01) 16 + #define MAX_EEPROM_SIZE 512 17 + #define OTP_INDICATOR_1 (0xF3) 18 + #define OTP_INDICATOR_2 (0xF7) 19 + 20 + static int lan743x_otp_write(struct lan743x_adapter *adapter, u32 offset, 21 + u32 length, u8 *data) 22 + { 23 + unsigned long timeout; 24 + u32 buf; 25 + int i; 26 + 27 + buf = lan743x_csr_read(adapter, OTP_PWR_DN); 28 + 29 + if (buf & OTP_PWR_DN_PWRDN_N_) { 30 + /* clear it and wait to be cleared */ 31 + lan743x_csr_write(adapter, OTP_PWR_DN, 0); 32 + 33 + timeout = jiffies + HZ; 34 + do { 35 + udelay(1); 36 + buf = lan743x_csr_read(adapter, OTP_PWR_DN); 37 + if (time_after(jiffies, timeout)) { 38 + netif_warn(adapter, drv, adapter->netdev, 39 + "timeout on OTP_PWR_DN completion\n"); 40 + return -EIO; 41 + } 42 + } while (buf & OTP_PWR_DN_PWRDN_N_); 43 + } 44 + 45 + /* set to BYTE program mode */ 46 + lan743x_csr_write(adapter, OTP_PRGM_MODE, OTP_PRGM_MODE_BYTE_); 47 + 48 + for (i = 0; i < length; i++) { 49 + lan743x_csr_write(adapter, OTP_ADDR1, 50 + ((offset + i) >> 8) & 51 + OTP_ADDR1_15_11_MASK_); 52 + lan743x_csr_write(adapter, OTP_ADDR2, 53 + ((offset + i) & 54 + OTP_ADDR2_10_3_MASK_)); 55 + lan743x_csr_write(adapter, OTP_PRGM_DATA, data[i]); 56 + lan743x_csr_write(adapter, OTP_TST_CMD, OTP_TST_CMD_PRGVRFY_); 57 + lan743x_csr_write(adapter, OTP_CMD_GO, OTP_CMD_GO_GO_); 58 + 59 + timeout = jiffies + HZ; 60 + do { 61 + udelay(1); 62 + buf = lan743x_csr_read(adapter, OTP_STATUS); 63 + if (time_after(jiffies, timeout)) { 64 + netif_warn(adapter, drv, adapter->netdev, 65 + "Timeout on OTP_STATUS completion\n"); 66 + return -EIO; 67 + } 68 + } while (buf & OTP_STATUS_BUSY_); 69 + } 70 + 71 + return 0; 72 + } 73 + 74 + static int lan743x_eeprom_wait(struct lan743x_adapter *adapter) 75 + { 76 + unsigned long start_time = jiffies; 77 + u32 val; 78 + 79 + do { 80 + val = lan743x_csr_read(adapter, E2P_CMD); 81 + 82 + if (!(val & E2P_CMD_EPC_BUSY_) || 83 + (val & E2P_CMD_EPC_TIMEOUT_)) 84 + break; 85 + usleep_range(40, 100); 86 + } while (!time_after(jiffies, start_time + HZ)); 87 + 88 + if (val & (E2P_CMD_EPC_TIMEOUT_ | E2P_CMD_EPC_BUSY_)) { 89 + netif_warn(adapter, drv, adapter->netdev, 90 + "EEPROM read operation timeout\n"); 91 + return -EIO; 92 + } 93 + 94 + return 0; 95 + } 96 + 97 + static int lan743x_eeprom_confirm_not_busy(struct lan743x_adapter *adapter) 98 + { 99 + unsigned long start_time = jiffies; 100 + u32 val; 101 + 102 + do { 103 + val = lan743x_csr_read(adapter, E2P_CMD); 104 + 105 + if (!(val & E2P_CMD_EPC_BUSY_)) 106 + return 0; 107 + 108 + usleep_range(40, 100); 109 + } while (!time_after(jiffies, start_time + HZ)); 110 + 111 + netif_warn(adapter, drv, adapter->netdev, "EEPROM is busy\n"); 112 + return -EIO; 113 + } 114 + 115 + static int lan743x_eeprom_read(struct lan743x_adapter *adapter, 116 + u32 offset, u32 length, u8 *data) 117 + { 118 + int retval; 119 + u32 val; 120 + int i; 121 + 122 + retval = lan743x_eeprom_confirm_not_busy(adapter); 123 + if (retval) 124 + return retval; 125 + 126 + for (i = 0; i < length; i++) { 127 + val = E2P_CMD_EPC_BUSY_ | E2P_CMD_EPC_CMD_READ_; 128 + val |= (offset & E2P_CMD_EPC_ADDR_MASK_); 129 + lan743x_csr_write(adapter, E2P_CMD, val); 130 + 131 + retval = lan743x_eeprom_wait(adapter); 132 + if (retval < 0) 133 + return retval; 134 + 135 + val = lan743x_csr_read(adapter, E2P_DATA); 136 + data[i] = val & 0xFF; 137 + offset++; 138 + } 139 + 140 + return 0; 141 + } 142 + 143 + static int lan743x_eeprom_write(struct lan743x_adapter *adapter, 144 + u32 offset, u32 length, u8 *data) 145 + { 146 + int retval; 147 + u32 val; 148 + int i; 149 + 150 + retval = lan743x_eeprom_confirm_not_busy(adapter); 151 + if (retval) 152 + return retval; 153 + 154 + /* Issue write/erase enable command */ 155 + val = E2P_CMD_EPC_BUSY_ | E2P_CMD_EPC_CMD_EWEN_; 156 + lan743x_csr_write(adapter, E2P_CMD, val); 157 + 158 + retval = lan743x_eeprom_wait(adapter); 159 + if (retval < 0) 160 + return retval; 161 + 162 + for (i = 0; i < length; i++) { 163 + /* Fill data register */ 164 + val = data[i]; 165 + lan743x_csr_write(adapter, E2P_DATA, val); 166 + 167 + /* Send "write" command */ 168 + val = E2P_CMD_EPC_BUSY_ | E2P_CMD_EPC_CMD_WRITE_; 169 + val |= (offset & E2P_CMD_EPC_ADDR_MASK_); 170 + lan743x_csr_write(adapter, E2P_CMD, val); 171 + 172 + retval = lan743x_eeprom_wait(adapter); 173 + if (retval < 0) 174 + return retval; 175 + 176 + offset++; 177 + } 178 + 179 + return 0; 180 + } 181 + 182 + static void lan743x_ethtool_get_drvinfo(struct net_device *netdev, 183 + struct ethtool_drvinfo *info) 184 + { 185 + struct lan743x_adapter *adapter = netdev_priv(netdev); 186 + 187 + strlcpy(info->driver, DRIVER_NAME, sizeof(info->driver)); 188 + strlcpy(info->bus_info, 189 + pci_name(adapter->pdev), sizeof(info->bus_info)); 190 + } 191 + 192 + static u32 lan743x_ethtool_get_msglevel(struct net_device *netdev) 193 + { 194 + struct lan743x_adapter *adapter = netdev_priv(netdev); 195 + 196 + return adapter->msg_enable; 197 + } 198 + 199 + static void lan743x_ethtool_set_msglevel(struct net_device *netdev, 200 + u32 msglevel) 201 + { 202 + struct lan743x_adapter *adapter = netdev_priv(netdev); 203 + 204 + adapter->msg_enable = msglevel; 205 + } 206 + 207 + static int lan743x_ethtool_get_eeprom_len(struct net_device *netdev) 208 + { 209 + return MAX_EEPROM_SIZE; 210 + } 211 + 212 + static int lan743x_ethtool_get_eeprom(struct net_device *netdev, 213 + struct ethtool_eeprom *ee, u8 *data) 214 + { 215 + struct lan743x_adapter *adapter = netdev_priv(netdev); 216 + 217 + return lan743x_eeprom_read(adapter, ee->offset, ee->len, data); 218 + } 219 + 220 + static int lan743x_ethtool_set_eeprom(struct net_device *netdev, 221 + struct ethtool_eeprom *ee, u8 *data) 222 + { 223 + struct lan743x_adapter *adapter = netdev_priv(netdev); 224 + int ret = -EINVAL; 225 + 226 + if (ee->magic == LAN743X_EEPROM_MAGIC) 227 + ret = lan743x_eeprom_write(adapter, ee->offset, ee->len, 228 + data); 229 + /* Beware! OTP is One Time Programming ONLY! 230 + * So do some strict condition check before messing up 231 + */ 232 + else if ((ee->magic == LAN743X_OTP_MAGIC) && 233 + (ee->offset == 0) && 234 + (ee->len == MAX_EEPROM_SIZE) && 235 + (data[0] == OTP_INDICATOR_1)) 236 + ret = lan743x_otp_write(adapter, ee->offset, ee->len, data); 237 + 238 + return ret; 239 + } 240 + 241 + static const char lan743x_set0_hw_cnt_strings[][ETH_GSTRING_LEN] = { 242 + "RX FCS Errors", 243 + "RX Alignment Errors", 244 + "Rx Fragment Errors", 245 + "RX Jabber Errors", 246 + "RX Undersize Frame Errors", 247 + "RX Oversize Frame Errors", 248 + "RX Dropped Frames", 249 + "RX Unicast Byte Count", 250 + "RX Broadcast Byte Count", 251 + "RX Multicast Byte Count", 252 + "RX Unicast Frames", 253 + "RX Broadcast Frames", 254 + "RX Multicast Frames", 255 + "RX Pause Frames", 256 + "RX 64 Byte Frames", 257 + "RX 65 - 127 Byte Frames", 258 + "RX 128 - 255 Byte Frames", 259 + "RX 256 - 511 Bytes Frames", 260 + "RX 512 - 1023 Byte Frames", 261 + "RX 1024 - 1518 Byte Frames", 262 + "RX Greater 1518 Byte Frames", 263 + }; 264 + 265 + static const char lan743x_set1_sw_cnt_strings[][ETH_GSTRING_LEN] = { 266 + "RX Queue 0 Frames", 267 + "RX Queue 1 Frames", 268 + "RX Queue 2 Frames", 269 + "RX Queue 3 Frames", 270 + }; 271 + 272 + static const char lan743x_set2_hw_cnt_strings[][ETH_GSTRING_LEN] = { 273 + "RX Total Frames", 274 + "EEE RX LPI Transitions", 275 + "EEE RX LPI Time", 276 + "RX Counter Rollover Status", 277 + "TX FCS Errors", 278 + "TX Excess Deferral Errors", 279 + "TX Carrier Errors", 280 + "TX Bad Byte Count", 281 + "TX Single Collisions", 282 + "TX Multiple Collisions", 283 + "TX Excessive Collision", 284 + "TX Late Collisions", 285 + "TX Unicast Byte Count", 286 + "TX Broadcast Byte Count", 287 + "TX Multicast Byte Count", 288 + "TX Unicast Frames", 289 + "TX Broadcast Frames", 290 + "TX Multicast Frames", 291 + "TX Pause Frames", 292 + "TX 64 Byte Frames", 293 + "TX 65 - 127 Byte Frames", 294 + "TX 128 - 255 Byte Frames", 295 + "TX 256 - 511 Bytes Frames", 296 + "TX 512 - 1023 Byte Frames", 297 + "TX 1024 - 1518 Byte Frames", 298 + "TX Greater 1518 Byte Frames", 299 + "TX Total Frames", 300 + "EEE TX LPI Transitions", 301 + "EEE TX LPI Time", 302 + "TX Counter Rollover Status", 303 + }; 304 + 305 + static const u32 lan743x_set0_hw_cnt_addr[] = { 306 + STAT_RX_FCS_ERRORS, 307 + STAT_RX_ALIGNMENT_ERRORS, 308 + STAT_RX_FRAGMENT_ERRORS, 309 + STAT_RX_JABBER_ERRORS, 310 + STAT_RX_UNDERSIZE_FRAME_ERRORS, 311 + STAT_RX_OVERSIZE_FRAME_ERRORS, 312 + STAT_RX_DROPPED_FRAMES, 313 + STAT_RX_UNICAST_BYTE_COUNT, 314 + STAT_RX_BROADCAST_BYTE_COUNT, 315 + STAT_RX_MULTICAST_BYTE_COUNT, 316 + STAT_RX_UNICAST_FRAMES, 317 + STAT_RX_BROADCAST_FRAMES, 318 + STAT_RX_MULTICAST_FRAMES, 319 + STAT_RX_PAUSE_FRAMES, 320 + STAT_RX_64_BYTE_FRAMES, 321 + STAT_RX_65_127_BYTE_FRAMES, 322 + STAT_RX_128_255_BYTE_FRAMES, 323 + STAT_RX_256_511_BYTES_FRAMES, 324 + STAT_RX_512_1023_BYTE_FRAMES, 325 + STAT_RX_1024_1518_BYTE_FRAMES, 326 + STAT_RX_GREATER_1518_BYTE_FRAMES, 327 + }; 328 + 329 + static const u32 lan743x_set2_hw_cnt_addr[] = { 330 + STAT_RX_TOTAL_FRAMES, 331 + STAT_EEE_RX_LPI_TRANSITIONS, 332 + STAT_EEE_RX_LPI_TIME, 333 + STAT_RX_COUNTER_ROLLOVER_STATUS, 334 + STAT_TX_FCS_ERRORS, 335 + STAT_TX_EXCESS_DEFERRAL_ERRORS, 336 + STAT_TX_CARRIER_ERRORS, 337 + STAT_TX_BAD_BYTE_COUNT, 338 + STAT_TX_SINGLE_COLLISIONS, 339 + STAT_TX_MULTIPLE_COLLISIONS, 340 + STAT_TX_EXCESSIVE_COLLISION, 341 + STAT_TX_LATE_COLLISIONS, 342 + STAT_TX_UNICAST_BYTE_COUNT, 343 + STAT_TX_BROADCAST_BYTE_COUNT, 344 + STAT_TX_MULTICAST_BYTE_COUNT, 345 + STAT_TX_UNICAST_FRAMES, 346 + STAT_TX_BROADCAST_FRAMES, 347 + STAT_TX_MULTICAST_FRAMES, 348 + STAT_TX_PAUSE_FRAMES, 349 + STAT_TX_64_BYTE_FRAMES, 350 + STAT_TX_65_127_BYTE_FRAMES, 351 + STAT_TX_128_255_BYTE_FRAMES, 352 + STAT_TX_256_511_BYTES_FRAMES, 353 + STAT_TX_512_1023_BYTE_FRAMES, 354 + STAT_TX_1024_1518_BYTE_FRAMES, 355 + STAT_TX_GREATER_1518_BYTE_FRAMES, 356 + STAT_TX_TOTAL_FRAMES, 357 + STAT_EEE_TX_LPI_TRANSITIONS, 358 + STAT_EEE_TX_LPI_TIME, 359 + STAT_TX_COUNTER_ROLLOVER_STATUS 360 + }; 361 + 362 + static void lan743x_ethtool_get_strings(struct net_device *netdev, 363 + u32 stringset, u8 *data) 364 + { 365 + switch (stringset) { 366 + case ETH_SS_STATS: 367 + memcpy(data, lan743x_set0_hw_cnt_strings, 368 + sizeof(lan743x_set0_hw_cnt_strings)); 369 + memcpy(&data[sizeof(lan743x_set0_hw_cnt_strings)], 370 + lan743x_set1_sw_cnt_strings, 371 + sizeof(lan743x_set1_sw_cnt_strings)); 372 + memcpy(&data[sizeof(lan743x_set0_hw_cnt_strings) + 373 + sizeof(lan743x_set1_sw_cnt_strings)], 374 + lan743x_set2_hw_cnt_strings, 375 + sizeof(lan743x_set2_hw_cnt_strings)); 376 + break; 377 + } 378 + } 379 + 380 + static void lan743x_ethtool_get_ethtool_stats(struct net_device *netdev, 381 + struct ethtool_stats *stats, 382 + u64 *data) 383 + { 384 + struct lan743x_adapter *adapter = netdev_priv(netdev); 385 + int data_index = 0; 386 + u32 buf; 387 + int i; 388 + 389 + for (i = 0; i < ARRAY_SIZE(lan743x_set0_hw_cnt_addr); i++) { 390 + buf = lan743x_csr_read(adapter, lan743x_set0_hw_cnt_addr[i]); 391 + data[data_index++] = (u64)buf; 392 + } 393 + for (i = 0; i < ARRAY_SIZE(adapter->rx); i++) 394 + data[data_index++] = (u64)(adapter->rx[i].frame_count); 395 + for (i = 0; i < ARRAY_SIZE(lan743x_set2_hw_cnt_addr); i++) { 396 + buf = lan743x_csr_read(adapter, lan743x_set2_hw_cnt_addr[i]); 397 + data[data_index++] = (u64)buf; 398 + } 399 + } 400 + 401 + static int lan743x_ethtool_get_sset_count(struct net_device *netdev, int sset) 402 + { 403 + switch (sset) { 404 + case ETH_SS_STATS: 405 + { 406 + int ret; 407 + 408 + ret = ARRAY_SIZE(lan743x_set0_hw_cnt_strings); 409 + ret += ARRAY_SIZE(lan743x_set1_sw_cnt_strings); 410 + ret += ARRAY_SIZE(lan743x_set2_hw_cnt_strings); 411 + return ret; 412 + } 413 + default: 414 + return -EOPNOTSUPP; 415 + } 416 + } 417 + 418 + static int lan743x_ethtool_get_rxnfc(struct net_device *netdev, 419 + struct ethtool_rxnfc *rxnfc, 420 + u32 *rule_locs) 421 + { 422 + switch (rxnfc->cmd) { 423 + case ETHTOOL_GRXFH: 424 + rxnfc->data = 0; 425 + switch (rxnfc->flow_type) { 426 + case TCP_V4_FLOW:case UDP_V4_FLOW: 427 + case TCP_V6_FLOW:case UDP_V6_FLOW: 428 + rxnfc->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3; 429 + /* fall through */ 430 + case IPV4_FLOW: case IPV6_FLOW: 431 + rxnfc->data |= RXH_IP_SRC | RXH_IP_DST; 432 + return 0; 433 + } 434 + break; 435 + case ETHTOOL_GRXRINGS: 436 + rxnfc->data = LAN743X_USED_RX_CHANNELS; 437 + return 0; 438 + } 439 + return -EOPNOTSUPP; 440 + } 441 + 442 + static u32 lan743x_ethtool_get_rxfh_key_size(struct net_device *netdev) 443 + { 444 + return 40; 445 + } 446 + 447 + static u32 lan743x_ethtool_get_rxfh_indir_size(struct net_device *netdev) 448 + { 449 + return 128; 450 + } 451 + 452 + static int lan743x_ethtool_get_rxfh(struct net_device *netdev, 453 + u32 *indir, u8 *key, u8 *hfunc) 454 + { 455 + struct lan743x_adapter *adapter = netdev_priv(netdev); 456 + 457 + if (indir) { 458 + int dw_index; 459 + int byte_index = 0; 460 + 461 + for (dw_index = 0; dw_index < 32; dw_index++) { 462 + u32 four_entries = 463 + lan743x_csr_read(adapter, RFE_INDX(dw_index)); 464 + 465 + byte_index = dw_index << 2; 466 + indir[byte_index + 0] = 467 + ((four_entries >> 0) & 0x000000FF); 468 + indir[byte_index + 1] = 469 + ((four_entries >> 8) & 0x000000FF); 470 + indir[byte_index + 2] = 471 + ((four_entries >> 16) & 0x000000FF); 472 + indir[byte_index + 3] = 473 + ((four_entries >> 24) & 0x000000FF); 474 + } 475 + } 476 + if (key) { 477 + int dword_index; 478 + int byte_index = 0; 479 + 480 + for (dword_index = 0; dword_index < 10; dword_index++) { 481 + u32 four_entries = 482 + lan743x_csr_read(adapter, 483 + RFE_HASH_KEY(dword_index)); 484 + 485 + byte_index = dword_index << 2; 486 + key[byte_index + 0] = 487 + ((four_entries >> 0) & 0x000000FF); 488 + key[byte_index + 1] = 489 + ((four_entries >> 8) & 0x000000FF); 490 + key[byte_index + 2] = 491 + ((four_entries >> 16) & 0x000000FF); 492 + key[byte_index + 3] = 493 + ((four_entries >> 24) & 0x000000FF); 494 + } 495 + } 496 + if (hfunc) 497 + (*hfunc) = ETH_RSS_HASH_TOP; 498 + return 0; 499 + } 500 + 501 + static int lan743x_ethtool_set_rxfh(struct net_device *netdev, 502 + const u32 *indir, const u8 *key, 503 + const u8 hfunc) 504 + { 505 + struct lan743x_adapter *adapter = netdev_priv(netdev); 506 + 507 + if (hfunc != ETH_RSS_HASH_NO_CHANGE && hfunc != ETH_RSS_HASH_TOP) 508 + return -EOPNOTSUPP; 509 + 510 + if (indir) { 511 + u32 indir_value = 0; 512 + int dword_index = 0; 513 + int byte_index = 0; 514 + 515 + for (dword_index = 0; dword_index < 32; dword_index++) { 516 + byte_index = dword_index << 2; 517 + indir_value = 518 + (((indir[byte_index + 0] & 0x000000FF) << 0) | 519 + ((indir[byte_index + 1] & 0x000000FF) << 8) | 520 + ((indir[byte_index + 2] & 0x000000FF) << 16) | 521 + ((indir[byte_index + 3] & 0x000000FF) << 24)); 522 + lan743x_csr_write(adapter, RFE_INDX(dword_index), 523 + indir_value); 524 + } 525 + } 526 + if (key) { 527 + int dword_index = 0; 528 + int byte_index = 0; 529 + u32 key_value = 0; 530 + 531 + for (dword_index = 0; dword_index < 10; dword_index++) { 532 + byte_index = dword_index << 2; 533 + key_value = 534 + ((((u32)(key[byte_index + 0])) << 0) | 535 + (((u32)(key[byte_index + 1])) << 8) | 536 + (((u32)(key[byte_index + 2])) << 16) | 537 + (((u32)(key[byte_index + 3])) << 24)); 538 + lan743x_csr_write(adapter, RFE_HASH_KEY(dword_index), 539 + key_value); 540 + } 541 + } 542 + return 0; 543 + } 544 + 545 + static int lan743x_ethtool_get_eee(struct net_device *netdev, 546 + struct ethtool_eee *eee) 547 + { 548 + struct lan743x_adapter *adapter = netdev_priv(netdev); 549 + struct phy_device *phydev = netdev->phydev; 550 + u32 buf; 551 + int ret; 552 + 553 + if (!phydev) 554 + return -EIO; 555 + if (!phydev->drv) { 556 + netif_err(adapter, drv, adapter->netdev, 557 + "Missing PHY Driver\n"); 558 + return -EIO; 559 + } 560 + 561 + ret = phy_ethtool_get_eee(phydev, eee); 562 + if (ret < 0) 563 + return ret; 564 + 565 + buf = lan743x_csr_read(adapter, MAC_CR); 566 + if (buf & MAC_CR_EEE_EN_) { 567 + eee->eee_enabled = true; 568 + eee->eee_active = !!(eee->advertised & eee->lp_advertised); 569 + eee->tx_lpi_enabled = true; 570 + /* EEE_TX_LPI_REQ_DLY & tx_lpi_timer are same uSec unit */ 571 + buf = lan743x_csr_read(adapter, MAC_EEE_TX_LPI_REQ_DLY_CNT); 572 + eee->tx_lpi_timer = buf; 573 + } else { 574 + eee->eee_enabled = false; 575 + eee->eee_active = false; 576 + eee->tx_lpi_enabled = false; 577 + eee->tx_lpi_timer = 0; 578 + } 579 + 580 + return 0; 581 + } 582 + 583 + static int lan743x_ethtool_set_eee(struct net_device *netdev, 584 + struct ethtool_eee *eee) 585 + { 586 + struct lan743x_adapter *adapter = netdev_priv(netdev); 587 + struct phy_device *phydev = NULL; 588 + u32 buf = 0; 589 + int ret = 0; 590 + 591 + if (!netdev) 592 + return -EINVAL; 593 + adapter = netdev_priv(netdev); 594 + if (!adapter) 595 + return -EINVAL; 596 + phydev = netdev->phydev; 597 + if (!phydev) 598 + return -EIO; 599 + if (!phydev->drv) { 600 + netif_err(adapter, drv, adapter->netdev, 601 + "Missing PHY Driver\n"); 602 + return -EIO; 603 + } 604 + 605 + if (eee->eee_enabled) { 606 + ret = phy_init_eee(phydev, 0); 607 + if (ret) { 608 + netif_err(adapter, drv, adapter->netdev, 609 + "EEE initialization failed\n"); 610 + return ret; 611 + } 612 + 613 + buf = (u32)eee->tx_lpi_timer; 614 + lan743x_csr_write(adapter, MAC_EEE_TX_LPI_REQ_DLY_CNT, buf); 615 + 616 + buf = lan743x_csr_read(adapter, MAC_CR); 617 + buf |= MAC_CR_EEE_EN_; 618 + lan743x_csr_write(adapter, MAC_CR, buf); 619 + } else { 620 + buf = lan743x_csr_read(adapter, MAC_CR); 621 + buf &= ~MAC_CR_EEE_EN_; 622 + lan743x_csr_write(adapter, MAC_CR, buf); 623 + } 624 + 625 + return phy_ethtool_set_eee(phydev, eee); 626 + } 627 + 628 + #ifdef CONFIG_PM 629 + static void lan743x_ethtool_get_wol(struct net_device *netdev, 630 + struct ethtool_wolinfo *wol) 631 + { 632 + struct lan743x_adapter *adapter = netdev_priv(netdev); 633 + 634 + wol->supported = 0; 635 + wol->wolopts = 0; 636 + phy_ethtool_get_wol(netdev->phydev, wol); 637 + 638 + wol->supported |= WAKE_BCAST | WAKE_UCAST | WAKE_MCAST | 639 + WAKE_MAGIC | WAKE_PHY | WAKE_ARP; 640 + 641 + wol->wolopts |= adapter->wolopts; 642 + } 643 + 644 + static int lan743x_ethtool_set_wol(struct net_device *netdev, 645 + struct ethtool_wolinfo *wol) 646 + { 647 + struct lan743x_adapter *adapter = netdev_priv(netdev); 648 + 649 + adapter->wolopts = 0; 650 + if (wol->wolopts & WAKE_UCAST) 651 + adapter->wolopts |= WAKE_UCAST; 652 + if (wol->wolopts & WAKE_MCAST) 653 + adapter->wolopts |= WAKE_MCAST; 654 + if (wol->wolopts & WAKE_BCAST) 655 + adapter->wolopts |= WAKE_BCAST; 656 + if (wol->wolopts & WAKE_MAGIC) 657 + adapter->wolopts |= WAKE_MAGIC; 658 + if (wol->wolopts & WAKE_PHY) 659 + adapter->wolopts |= WAKE_PHY; 660 + if (wol->wolopts & WAKE_ARP) 661 + adapter->wolopts |= WAKE_ARP; 662 + 663 + device_set_wakeup_enable(&adapter->pdev->dev, (bool)wol->wolopts); 664 + 665 + phy_ethtool_set_wol(netdev->phydev, wol); 666 + 667 + return 0; 668 + } 669 + #endif /* CONFIG_PM */ 670 + 671 + const struct ethtool_ops lan743x_ethtool_ops = { 672 + .get_drvinfo = lan743x_ethtool_get_drvinfo, 673 + .get_msglevel = lan743x_ethtool_get_msglevel, 674 + .set_msglevel = lan743x_ethtool_set_msglevel, 675 + .get_link = ethtool_op_get_link, 676 + 677 + .get_eeprom_len = lan743x_ethtool_get_eeprom_len, 678 + .get_eeprom = lan743x_ethtool_get_eeprom, 679 + .set_eeprom = lan743x_ethtool_set_eeprom, 680 + .get_strings = lan743x_ethtool_get_strings, 681 + .get_ethtool_stats = lan743x_ethtool_get_ethtool_stats, 682 + .get_sset_count = lan743x_ethtool_get_sset_count, 683 + .get_rxnfc = lan743x_ethtool_get_rxnfc, 684 + .get_rxfh_key_size = lan743x_ethtool_get_rxfh_key_size, 685 + .get_rxfh_indir_size = lan743x_ethtool_get_rxfh_indir_size, 686 + .get_rxfh = lan743x_ethtool_get_rxfh, 687 + .set_rxfh = lan743x_ethtool_set_rxfh, 688 + .get_eee = lan743x_ethtool_get_eee, 689 + .set_eee = lan743x_ethtool_set_eee, 690 + .get_link_ksettings = phy_ethtool_get_link_ksettings, 691 + .set_link_ksettings = phy_ethtool_set_link_ksettings, 692 + #ifdef CONFIG_PM 693 + .get_wol = lan743x_ethtool_get_wol, 694 + .set_wol = lan743x_ethtool_set_wol, 695 + #endif 696 + };
+11
drivers/net/ethernet/microchip/lan743x_ethtool.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0+ */ 2 + /* Copyright (C) 2018 Microchip Technology Inc. */ 3 + 4 + #ifndef _LAN743X_ETHTOOL_H 5 + #define _LAN743X_ETHTOOL_H 6 + 7 + #include "linux/ethtool.h" 8 + 9 + extern const struct ethtool_ops lan743x_ethtool_ops; 10 + 11 + #endif /* _LAN743X_ETHTOOL_H */
+201 -3
drivers/net/ethernet/microchip/lan743x_main.c
··· 11 11 #include <linux/phy.h> 12 12 #include <linux/rtnetlink.h> 13 13 #include <linux/iopoll.h> 14 + #include <linux/crc16.h> 14 15 #include "lan743x_main.h" 16 + #include "lan743x_ethtool.h" 15 17 16 18 static void lan743x_pci_cleanup(struct lan743x_adapter *adapter) 17 19 { ··· 55 53 return ret; 56 54 } 57 55 58 - static u32 lan743x_csr_read(struct lan743x_adapter *adapter, int offset) 56 + u32 lan743x_csr_read(struct lan743x_adapter *adapter, int offset) 59 57 { 60 58 return ioread32(&adapter->csr.csr_address[offset]); 61 59 } 62 60 63 - static void lan743x_csr_write(struct lan743x_adapter *adapter, int offset, 64 - u32 data) 61 + void lan743x_csr_write(struct lan743x_adapter *adapter, int offset, 62 + u32 data) 65 63 { 66 64 iowrite32(data, &adapter->csr.csr_address[offset]); 67 65 } ··· 1023 1021 1024 1022 return_error: 1025 1023 return ret; 1024 + } 1025 + 1026 + static void lan743x_rfe_open(struct lan743x_adapter *adapter) 1027 + { 1028 + lan743x_csr_write(adapter, RFE_RSS_CFG, 1029 + RFE_RSS_CFG_UDP_IPV6_EX_ | 1030 + RFE_RSS_CFG_TCP_IPV6_EX_ | 1031 + RFE_RSS_CFG_IPV6_EX_ | 1032 + RFE_RSS_CFG_UDP_IPV6_ | 1033 + RFE_RSS_CFG_TCP_IPV6_ | 1034 + RFE_RSS_CFG_IPV6_ | 1035 + RFE_RSS_CFG_UDP_IPV4_ | 1036 + RFE_RSS_CFG_TCP_IPV4_ | 1037 + RFE_RSS_CFG_IPV4_ | 1038 + RFE_RSS_CFG_VALID_HASH_BITS_ | 1039 + RFE_RSS_CFG_RSS_QUEUE_ENABLE_ | 1040 + RFE_RSS_CFG_RSS_HASH_STORE_ | 1041 + RFE_RSS_CFG_RSS_ENABLE_); 1026 1042 } 1027 1043 1028 1044 static void lan743x_rfe_update_mac_address(struct lan743x_adapter *adapter) ··· 2437 2417 if (ret) 2438 2418 goto close_mac; 2439 2419 2420 + lan743x_rfe_open(adapter); 2421 + 2440 2422 for (index = 0; index < LAN743X_USED_RX_CHANNELS; index++) { 2441 2423 ret = lan743x_rx_open(&adapter->rx[index]); 2442 2424 if (ret) ··· 2711 2689 goto cleanup_hardware; 2712 2690 2713 2691 adapter->netdev->netdev_ops = &lan743x_netdev_ops; 2692 + adapter->netdev->ethtool_ops = &lan743x_ethtool_ops; 2714 2693 adapter->netdev->features = NETIF_F_SG | NETIF_F_TSO | NETIF_F_HW_CSUM; 2715 2694 adapter->netdev->hw_features = adapter->netdev->features; 2716 2695 ··· 2770 2747 lan743x_netdev_close(netdev); 2771 2748 rtnl_unlock(); 2772 2749 2750 + #ifdef CONFIG_PM 2751 + pci_save_state(pdev); 2752 + #endif 2753 + 2773 2754 /* clean up lan743x portion */ 2774 2755 lan743x_hardware_cleanup(adapter); 2775 2756 } 2757 + 2758 + #ifdef CONFIG_PM 2759 + static u16 lan743x_pm_wakeframe_crc16(const u8 *buf, int len) 2760 + { 2761 + return bitrev16(crc16(0xFFFF, buf, len)); 2762 + } 2763 + 2764 + static void lan743x_pm_set_wol(struct lan743x_adapter *adapter) 2765 + { 2766 + const u8 ipv4_multicast[3] = { 0x01, 0x00, 0x5E }; 2767 + const u8 ipv6_multicast[3] = { 0x33, 0x33 }; 2768 + const u8 arp_type[2] = { 0x08, 0x06 }; 2769 + int mask_index; 2770 + u32 pmtctl; 2771 + u32 wucsr; 2772 + u32 macrx; 2773 + u16 crc; 2774 + 2775 + for (mask_index = 0; mask_index < MAC_NUM_OF_WUF_CFG; mask_index++) 2776 + lan743x_csr_write(adapter, MAC_WUF_CFG(mask_index), 0); 2777 + 2778 + /* clear wake settings */ 2779 + pmtctl = lan743x_csr_read(adapter, PMT_CTL); 2780 + pmtctl |= PMT_CTL_WUPS_MASK_; 2781 + pmtctl &= ~(PMT_CTL_GPIO_WAKEUP_EN_ | PMT_CTL_EEE_WAKEUP_EN_ | 2782 + PMT_CTL_WOL_EN_ | PMT_CTL_MAC_D3_RX_CLK_OVR_ | 2783 + PMT_CTL_RX_FCT_RFE_D3_CLK_OVR_ | PMT_CTL_ETH_PHY_WAKE_EN_); 2784 + 2785 + macrx = lan743x_csr_read(adapter, MAC_RX); 2786 + 2787 + wucsr = 0; 2788 + mask_index = 0; 2789 + 2790 + pmtctl |= PMT_CTL_ETH_PHY_D3_COLD_OVR_ | PMT_CTL_ETH_PHY_D3_OVR_; 2791 + 2792 + if (adapter->wolopts & WAKE_PHY) { 2793 + pmtctl |= PMT_CTL_ETH_PHY_EDPD_PLL_CTL_; 2794 + pmtctl |= PMT_CTL_ETH_PHY_WAKE_EN_; 2795 + } 2796 + if (adapter->wolopts & WAKE_MAGIC) { 2797 + wucsr |= MAC_WUCSR_MPEN_; 2798 + macrx |= MAC_RX_RXEN_; 2799 + pmtctl |= PMT_CTL_WOL_EN_ | PMT_CTL_MAC_D3_RX_CLK_OVR_; 2800 + } 2801 + if (adapter->wolopts & WAKE_UCAST) { 2802 + wucsr |= MAC_WUCSR_RFE_WAKE_EN_ | MAC_WUCSR_PFDA_EN_; 2803 + macrx |= MAC_RX_RXEN_; 2804 + pmtctl |= PMT_CTL_WOL_EN_ | PMT_CTL_MAC_D3_RX_CLK_OVR_; 2805 + pmtctl |= PMT_CTL_RX_FCT_RFE_D3_CLK_OVR_; 2806 + } 2807 + if (adapter->wolopts & WAKE_BCAST) { 2808 + wucsr |= MAC_WUCSR_RFE_WAKE_EN_ | MAC_WUCSR_BCST_EN_; 2809 + macrx |= MAC_RX_RXEN_; 2810 + pmtctl |= PMT_CTL_WOL_EN_ | PMT_CTL_MAC_D3_RX_CLK_OVR_; 2811 + pmtctl |= PMT_CTL_RX_FCT_RFE_D3_CLK_OVR_; 2812 + } 2813 + if (adapter->wolopts & WAKE_MCAST) { 2814 + /* IPv4 multicast */ 2815 + crc = lan743x_pm_wakeframe_crc16(ipv4_multicast, 3); 2816 + lan743x_csr_write(adapter, MAC_WUF_CFG(mask_index), 2817 + MAC_WUF_CFG_EN_ | MAC_WUF_CFG_TYPE_MCAST_ | 2818 + (0 << MAC_WUF_CFG_OFFSET_SHIFT_) | 2819 + (crc & MAC_WUF_CFG_CRC16_MASK_)); 2820 + lan743x_csr_write(adapter, MAC_WUF_MASK0(mask_index), 7); 2821 + lan743x_csr_write(adapter, MAC_WUF_MASK1(mask_index), 0); 2822 + lan743x_csr_write(adapter, MAC_WUF_MASK2(mask_index), 0); 2823 + lan743x_csr_write(adapter, MAC_WUF_MASK3(mask_index), 0); 2824 + mask_index++; 2825 + 2826 + /* IPv6 multicast */ 2827 + crc = lan743x_pm_wakeframe_crc16(ipv6_multicast, 2); 2828 + lan743x_csr_write(adapter, MAC_WUF_CFG(mask_index), 2829 + MAC_WUF_CFG_EN_ | MAC_WUF_CFG_TYPE_MCAST_ | 2830 + (0 << MAC_WUF_CFG_OFFSET_SHIFT_) | 2831 + (crc & MAC_WUF_CFG_CRC16_MASK_)); 2832 + lan743x_csr_write(adapter, MAC_WUF_MASK0(mask_index), 3); 2833 + lan743x_csr_write(adapter, MAC_WUF_MASK1(mask_index), 0); 2834 + lan743x_csr_write(adapter, MAC_WUF_MASK2(mask_index), 0); 2835 + lan743x_csr_write(adapter, MAC_WUF_MASK3(mask_index), 0); 2836 + mask_index++; 2837 + 2838 + wucsr |= MAC_WUCSR_RFE_WAKE_EN_ | MAC_WUCSR_WAKE_EN_; 2839 + macrx |= MAC_RX_RXEN_; 2840 + pmtctl |= PMT_CTL_WOL_EN_ | PMT_CTL_MAC_D3_RX_CLK_OVR_; 2841 + pmtctl |= PMT_CTL_RX_FCT_RFE_D3_CLK_OVR_; 2842 + } 2843 + if (adapter->wolopts & WAKE_ARP) { 2844 + /* set MAC_WUF_CFG & WUF_MASK 2845 + * for packettype (offset 12,13) = ARP (0x0806) 2846 + */ 2847 + crc = lan743x_pm_wakeframe_crc16(arp_type, 2); 2848 + lan743x_csr_write(adapter, MAC_WUF_CFG(mask_index), 2849 + MAC_WUF_CFG_EN_ | MAC_WUF_CFG_TYPE_ALL_ | 2850 + (0 << MAC_WUF_CFG_OFFSET_SHIFT_) | 2851 + (crc & MAC_WUF_CFG_CRC16_MASK_)); 2852 + lan743x_csr_write(adapter, MAC_WUF_MASK0(mask_index), 0x3000); 2853 + lan743x_csr_write(adapter, MAC_WUF_MASK1(mask_index), 0); 2854 + lan743x_csr_write(adapter, MAC_WUF_MASK2(mask_index), 0); 2855 + lan743x_csr_write(adapter, MAC_WUF_MASK3(mask_index), 0); 2856 + mask_index++; 2857 + 2858 + wucsr |= MAC_WUCSR_RFE_WAKE_EN_ | MAC_WUCSR_WAKE_EN_; 2859 + macrx |= MAC_RX_RXEN_; 2860 + pmtctl |= PMT_CTL_WOL_EN_ | PMT_CTL_MAC_D3_RX_CLK_OVR_; 2861 + pmtctl |= PMT_CTL_RX_FCT_RFE_D3_CLK_OVR_; 2862 + } 2863 + 2864 + lan743x_csr_write(adapter, MAC_WUCSR, wucsr); 2865 + lan743x_csr_write(adapter, PMT_CTL, pmtctl); 2866 + lan743x_csr_write(adapter, MAC_RX, macrx); 2867 + } 2868 + 2869 + static int lan743x_pm_suspend(struct device *dev) 2870 + { 2871 + struct pci_dev *pdev = to_pci_dev(dev); 2872 + struct net_device *netdev = pci_get_drvdata(pdev); 2873 + struct lan743x_adapter *adapter = netdev_priv(netdev); 2874 + int ret; 2875 + 2876 + lan743x_pcidev_shutdown(pdev); 2877 + 2878 + /* clear all wakes */ 2879 + lan743x_csr_write(adapter, MAC_WUCSR, 0); 2880 + lan743x_csr_write(adapter, MAC_WUCSR2, 0); 2881 + lan743x_csr_write(adapter, MAC_WK_SRC, 0xFFFFFFFF); 2882 + 2883 + if (adapter->wolopts) 2884 + lan743x_pm_set_wol(adapter); 2885 + 2886 + /* Host sets PME_En, put D3hot */ 2887 + ret = pci_prepare_to_sleep(pdev); 2888 + 2889 + return 0; 2890 + } 2891 + 2892 + static int lan743x_pm_resume(struct device *dev) 2893 + { 2894 + struct pci_dev *pdev = to_pci_dev(dev); 2895 + struct net_device *netdev = pci_get_drvdata(pdev); 2896 + struct lan743x_adapter *adapter = netdev_priv(netdev); 2897 + int ret; 2898 + 2899 + pci_set_power_state(pdev, PCI_D0); 2900 + pci_restore_state(pdev); 2901 + pci_save_state(pdev); 2902 + 2903 + ret = lan743x_hardware_init(adapter, pdev); 2904 + if (ret) { 2905 + netif_err(adapter, probe, adapter->netdev, 2906 + "lan743x_hardware_init returned %d\n", ret); 2907 + } 2908 + 2909 + /* open netdev when netdev is at running state while resume. 2910 + * For instance, it is true when system wakesup after pm-suspend 2911 + * However, it is false when system wakes up after suspend GUI menu 2912 + */ 2913 + if (netif_running(netdev)) 2914 + lan743x_netdev_open(netdev); 2915 + 2916 + netif_device_attach(netdev); 2917 + 2918 + return 0; 2919 + } 2920 + 2921 + const struct dev_pm_ops lan743x_pm_ops = { 2922 + SET_SYSTEM_SLEEP_PM_OPS(lan743x_pm_suspend, lan743x_pm_resume) 2923 + }; 2924 + #endif /*CONFIG_PM */ 2776 2925 2777 2926 static const struct pci_device_id lan743x_pcidev_tbl[] = { 2778 2927 { PCI_DEVICE(PCI_VENDOR_ID_SMSC, PCI_DEVICE_ID_SMSC_LAN7430) }, ··· 2956 2761 .id_table = lan743x_pcidev_tbl, 2957 2762 .probe = lan743x_pcidev_probe, 2958 2763 .remove = lan743x_pcidev_remove, 2764 + #ifdef CONFIG_PM 2765 + .driver.pm = &lan743x_pm_ops, 2766 + #endif 2959 2767 .shutdown = lan743x_pcidev_shutdown, 2960 2768 }; 2961 2769
+133
drivers/net/ethernet/microchip/lan743x_main.h
··· 24 24 #define HW_CFG_LRST_ BIT(1) 25 25 26 26 #define PMT_CTL (0x014) 27 + #define PMT_CTL_ETH_PHY_D3_COLD_OVR_ BIT(27) 28 + #define PMT_CTL_MAC_D3_RX_CLK_OVR_ BIT(25) 29 + #define PMT_CTL_ETH_PHY_EDPD_PLL_CTL_ BIT(24) 30 + #define PMT_CTL_ETH_PHY_D3_OVR_ BIT(23) 31 + #define PMT_CTL_RX_FCT_RFE_D3_CLK_OVR_ BIT(18) 32 + #define PMT_CTL_GPIO_WAKEUP_EN_ BIT(15) 33 + #define PMT_CTL_EEE_WAKEUP_EN_ BIT(13) 27 34 #define PMT_CTL_READY_ BIT(7) 28 35 #define PMT_CTL_ETH_PHY_RST_ BIT(4) 36 + #define PMT_CTL_WOL_EN_ BIT(3) 37 + #define PMT_CTL_ETH_PHY_WAKE_EN_ BIT(2) 38 + #define PMT_CTL_WUPS_MASK_ (0x00000003) 29 39 30 40 #define DP_SEL (0x024) 31 41 #define DP_SEL_DPRDY_ BIT(31) ··· 51 41 #define DP_ADDR (0x02C) 52 42 53 43 #define DP_DATA_0 (0x030) 44 + 45 + #define E2P_CMD (0x040) 46 + #define E2P_CMD_EPC_BUSY_ BIT(31) 47 + #define E2P_CMD_EPC_CMD_WRITE_ (0x30000000) 48 + #define E2P_CMD_EPC_CMD_EWEN_ (0x20000000) 49 + #define E2P_CMD_EPC_CMD_READ_ (0x00000000) 50 + #define E2P_CMD_EPC_TIMEOUT_ BIT(10) 51 + #define E2P_CMD_EPC_ADDR_MASK_ (0x000001FF) 52 + 53 + #define E2P_DATA (0x044) 54 54 55 55 #define FCT_RX_CTL (0xAC) 56 56 #define FCT_RX_CTL_EN_(channel) BIT(28 + (channel)) ··· 82 62 ((value << 0) & FCT_FLOW_CTL_ON_THRESHOLD_) 83 63 84 64 #define MAC_CR (0x100) 65 + #define MAC_CR_EEE_EN_ BIT(17) 85 66 #define MAC_CR_ADD_ BIT(12) 86 67 #define MAC_CR_ASD_ BIT(11) 87 68 #define MAC_CR_CNTR_RST_ BIT(5) ··· 118 97 119 98 #define MAC_MII_DATA (0x124) 120 99 100 + #define MAC_EEE_TX_LPI_REQ_DLY_CNT (0x130) 101 + 102 + #define MAC_WUCSR (0x140) 103 + #define MAC_WUCSR_RFE_WAKE_EN_ BIT(14) 104 + #define MAC_WUCSR_PFDA_EN_ BIT(3) 105 + #define MAC_WUCSR_WAKE_EN_ BIT(2) 106 + #define MAC_WUCSR_MPEN_ BIT(1) 107 + #define MAC_WUCSR_BCST_EN_ BIT(0) 108 + 109 + #define MAC_WK_SRC (0x144) 110 + 111 + #define MAC_WUF_CFG0 (0x150) 112 + #define MAC_NUM_OF_WUF_CFG (32) 113 + #define MAC_WUF_CFG_BEGIN (MAC_WUF_CFG0) 114 + #define MAC_WUF_CFG(index) (MAC_WUF_CFG_BEGIN + (4 * (index))) 115 + #define MAC_WUF_CFG_EN_ BIT(31) 116 + #define MAC_WUF_CFG_TYPE_MCAST_ (0x02000000) 117 + #define MAC_WUF_CFG_TYPE_ALL_ (0x01000000) 118 + #define MAC_WUF_CFG_OFFSET_SHIFT_ (16) 119 + #define MAC_WUF_CFG_CRC16_MASK_ (0x0000FFFF) 120 + 121 + #define MAC_WUF_MASK0_0 (0x200) 122 + #define MAC_WUF_MASK0_1 (0x204) 123 + #define MAC_WUF_MASK0_2 (0x208) 124 + #define MAC_WUF_MASK0_3 (0x20C) 125 + #define MAC_WUF_MASK0_BEGIN (MAC_WUF_MASK0_0) 126 + #define MAC_WUF_MASK1_BEGIN (MAC_WUF_MASK0_1) 127 + #define MAC_WUF_MASK2_BEGIN (MAC_WUF_MASK0_2) 128 + #define MAC_WUF_MASK3_BEGIN (MAC_WUF_MASK0_3) 129 + #define MAC_WUF_MASK0(index) (MAC_WUF_MASK0_BEGIN + (0x10 * (index))) 130 + #define MAC_WUF_MASK1(index) (MAC_WUF_MASK1_BEGIN + (0x10 * (index))) 131 + #define MAC_WUF_MASK2(index) (MAC_WUF_MASK2_BEGIN + (0x10 * (index))) 132 + #define MAC_WUF_MASK3(index) (MAC_WUF_MASK3_BEGIN + (0x10 * (index))) 133 + 121 134 /* offset 0x400 - 0x500, x may range from 0 to 32, for a total of 33 entries */ 122 135 #define RFE_ADDR_FILT_HI(x) (0x400 + (8 * (x))) 123 136 #define RFE_ADDR_FILT_HI_VALID_ BIT(31) ··· 165 110 #define RFE_CTL_AU_ BIT(8) 166 111 #define RFE_CTL_MCAST_HASH_ BIT(3) 167 112 #define RFE_CTL_DA_PERFECT_ BIT(1) 113 + 114 + #define RFE_RSS_CFG (0x554) 115 + #define RFE_RSS_CFG_UDP_IPV6_EX_ BIT(16) 116 + #define RFE_RSS_CFG_TCP_IPV6_EX_ BIT(15) 117 + #define RFE_RSS_CFG_IPV6_EX_ BIT(14) 118 + #define RFE_RSS_CFG_UDP_IPV6_ BIT(13) 119 + #define RFE_RSS_CFG_TCP_IPV6_ BIT(12) 120 + #define RFE_RSS_CFG_IPV6_ BIT(11) 121 + #define RFE_RSS_CFG_UDP_IPV4_ BIT(10) 122 + #define RFE_RSS_CFG_TCP_IPV4_ BIT(9) 123 + #define RFE_RSS_CFG_IPV4_ BIT(8) 124 + #define RFE_RSS_CFG_VALID_HASH_BITS_ (0x000000E0) 125 + #define RFE_RSS_CFG_RSS_QUEUE_ENABLE_ BIT(2) 126 + #define RFE_RSS_CFG_RSS_HASH_STORE_ BIT(1) 127 + #define RFE_RSS_CFG_RSS_ENABLE_ BIT(0) 128 + 129 + #define RFE_HASH_KEY(index) (0x558 + (index << 2)) 130 + 131 + #define RFE_INDX(index) (0x580 + (index << 2)) 132 + 133 + #define MAC_WUCSR2 (0x600) 168 134 169 135 #define INT_STS (0x780) 170 136 #define INT_BIT_DMA_RX_(channel) BIT(24 + (channel)) ··· 364 288 #define TX_CFG_C_TX_DMA_INT_STS_AUTO_CLR_ BIT(3) 365 289 #define TX_CFG_C_TX_INT_STS_R2C_MODE_MASK_ (0x00000007) 366 290 291 + #define OTP_PWR_DN (0x1000) 292 + #define OTP_PWR_DN_PWRDN_N_ BIT(0) 293 + 294 + #define OTP_ADDR1 (0x1004) 295 + #define OTP_ADDR1_15_11_MASK_ (0x1F) 296 + 297 + #define OTP_ADDR2 (0x1008) 298 + #define OTP_ADDR2_10_3_MASK_ (0xFF) 299 + 300 + #define OTP_PRGM_DATA (0x1010) 301 + 302 + #define OTP_PRGM_MODE (0x1014) 303 + #define OTP_PRGM_MODE_BYTE_ BIT(0) 304 + 305 + #define OTP_TST_CMD (0x1024) 306 + #define OTP_TST_CMD_PRGVRFY_ BIT(3) 307 + 308 + #define OTP_CMD_GO (0x1028) 309 + #define OTP_CMD_GO_GO_ BIT(0) 310 + 311 + #define OTP_STATUS (0x1030) 312 + #define OTP_STATUS_BUSY_ BIT(0) 313 + 367 314 /* MAC statistics registers */ 368 315 #define STAT_RX_FCS_ERRORS (0x1200) 369 316 #define STAT_RX_ALIGNMENT_ERRORS (0x1204) 317 + #define STAT_RX_FRAGMENT_ERRORS (0x1208) 370 318 #define STAT_RX_JABBER_ERRORS (0x120C) 371 319 #define STAT_RX_UNDERSIZE_FRAME_ERRORS (0x1210) 372 320 #define STAT_RX_OVERSIZE_FRAME_ERRORS (0x1214) ··· 398 298 #define STAT_RX_UNICAST_BYTE_COUNT (0x121C) 399 299 #define STAT_RX_BROADCAST_BYTE_COUNT (0x1220) 400 300 #define STAT_RX_MULTICAST_BYTE_COUNT (0x1224) 301 + #define STAT_RX_UNICAST_FRAMES (0x1228) 302 + #define STAT_RX_BROADCAST_FRAMES (0x122C) 401 303 #define STAT_RX_MULTICAST_FRAMES (0x1230) 304 + #define STAT_RX_PAUSE_FRAMES (0x1234) 305 + #define STAT_RX_64_BYTE_FRAMES (0x1238) 306 + #define STAT_RX_65_127_BYTE_FRAMES (0x123C) 307 + #define STAT_RX_128_255_BYTE_FRAMES (0x1240) 308 + #define STAT_RX_256_511_BYTES_FRAMES (0x1244) 309 + #define STAT_RX_512_1023_BYTE_FRAMES (0x1248) 310 + #define STAT_RX_1024_1518_BYTE_FRAMES (0x124C) 311 + #define STAT_RX_GREATER_1518_BYTE_FRAMES (0x1250) 402 312 #define STAT_RX_TOTAL_FRAMES (0x1254) 313 + #define STAT_EEE_RX_LPI_TRANSITIONS (0x1258) 314 + #define STAT_EEE_RX_LPI_TIME (0x125C) 315 + #define STAT_RX_COUNTER_ROLLOVER_STATUS (0x127C) 403 316 404 317 #define STAT_TX_FCS_ERRORS (0x1280) 405 318 #define STAT_TX_EXCESS_DEFERRAL_ERRORS (0x1284) 406 319 #define STAT_TX_CARRIER_ERRORS (0x1288) 320 + #define STAT_TX_BAD_BYTE_COUNT (0x128C) 407 321 #define STAT_TX_SINGLE_COLLISIONS (0x1290) 408 322 #define STAT_TX_MULTIPLE_COLLISIONS (0x1294) 409 323 #define STAT_TX_EXCESSIVE_COLLISION (0x1298) ··· 425 311 #define STAT_TX_UNICAST_BYTE_COUNT (0x12A0) 426 312 #define STAT_TX_BROADCAST_BYTE_COUNT (0x12A4) 427 313 #define STAT_TX_MULTICAST_BYTE_COUNT (0x12A8) 314 + #define STAT_TX_UNICAST_FRAMES (0x12AC) 315 + #define STAT_TX_BROADCAST_FRAMES (0x12B0) 428 316 #define STAT_TX_MULTICAST_FRAMES (0x12B4) 317 + #define STAT_TX_PAUSE_FRAMES (0x12B8) 318 + #define STAT_TX_64_BYTE_FRAMES (0x12BC) 319 + #define STAT_TX_65_127_BYTE_FRAMES (0x12C0) 320 + #define STAT_TX_128_255_BYTE_FRAMES (0x12C4) 321 + #define STAT_TX_256_511_BYTES_FRAMES (0x12C8) 322 + #define STAT_TX_512_1023_BYTE_FRAMES (0x12CC) 323 + #define STAT_TX_1024_1518_BYTE_FRAMES (0x12D0) 324 + #define STAT_TX_GREATER_1518_BYTE_FRAMES (0x12D4) 429 325 #define STAT_TX_TOTAL_FRAMES (0x12D8) 326 + #define STAT_EEE_TX_LPI_TRANSITIONS (0x12DC) 327 + #define STAT_EEE_TX_LPI_TIME (0x12E0) 328 + #define STAT_TX_COUNTER_ROLLOVER_STATUS (0x12FC) 430 329 431 330 /* End of Register definitions */ 432 331 ··· 600 473 struct net_device *netdev; 601 474 struct mii_bus *mdiobus; 602 475 int msg_enable; 476 + #ifdef CONFIG_PM 477 + u32 wolopts; 478 + #endif 603 479 struct pci_dev *pdev; 604 480 struct lan743x_csr csr; 605 481 struct lan743x_intr intr; ··· 723 593 #define RX_PROCESS_RESULT_NOTHING_TO_DO (0) 724 594 #define RX_PROCESS_RESULT_PACKET_RECEIVED (1) 725 595 #define RX_PROCESS_RESULT_PACKET_DROPPED (2) 596 + 597 + u32 lan743x_csr_read(struct lan743x_adapter *adapter, int offset); 598 + void lan743x_csr_write(struct lan743x_adapter *adapter, int offset, u32 data); 726 599 727 600 #endif /* _LAN743X_H */