diff options
author | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
---|---|---|
committer | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
commit | ada47b5fe13d89735805b566185f4885f5a3f750 (patch) | |
tree | 644b88f8a71896307d71438e9b3af49126ffb22b /drivers/net/netxen/netxen_nic_ethtool.c | |
parent | 43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff) | |
parent | 3280f21d43ee541f97f8cda5792150d2dbec20d5 (diff) |
Merge branch 'wip-2.6.34' into old-private-masterarchived-private-master
Diffstat (limited to 'drivers/net/netxen/netxen_nic_ethtool.c')
-rw-r--r-- | drivers/net/netxen/netxen_nic_ethtool.c | 225 |
1 files changed, 82 insertions, 143 deletions
diff --git a/drivers/net/netxen/netxen_nic_ethtool.c b/drivers/net/netxen/netxen_nic_ethtool.c index 714f38791a9a..f8499e56cbee 100644 --- a/drivers/net/netxen/netxen_nic_ethtool.c +++ b/drivers/net/netxen/netxen_nic_ethtool.c | |||
@@ -19,7 +19,7 @@ | |||
19 | * MA 02111-1307, USA. | 19 | * MA 02111-1307, USA. |
20 | * | 20 | * |
21 | * The full GNU General Public License is included in this distribution | 21 | * The full GNU General Public License is included in this distribution |
22 | * in the file called LICENSE. | 22 | * in the file called "COPYING". |
23 | * | 23 | * |
24 | */ | 24 | */ |
25 | 25 | ||
@@ -66,7 +66,7 @@ static const char netxen_nic_gstrings_test[][ETH_GSTRING_LEN] = { | |||
66 | 66 | ||
67 | #define NETXEN_NIC_TEST_LEN ARRAY_SIZE(netxen_nic_gstrings_test) | 67 | #define NETXEN_NIC_TEST_LEN ARRAY_SIZE(netxen_nic_gstrings_test) |
68 | 68 | ||
69 | #define NETXEN_NIC_REGS_COUNT 42 | 69 | #define NETXEN_NIC_REGS_COUNT 30 |
70 | #define NETXEN_NIC_REGS_LEN (NETXEN_NIC_REGS_COUNT * sizeof(__le32)) | 70 | #define NETXEN_NIC_REGS_LEN (NETXEN_NIC_REGS_COUNT * sizeof(__le32)) |
71 | #define NETXEN_MAX_EEPROM_LEN 1024 | 71 | #define NETXEN_MAX_EEPROM_LEN 1024 |
72 | 72 | ||
@@ -85,11 +85,9 @@ netxen_nic_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *drvinfo) | |||
85 | 85 | ||
86 | strncpy(drvinfo->driver, netxen_nic_driver_name, 32); | 86 | strncpy(drvinfo->driver, netxen_nic_driver_name, 32); |
87 | strncpy(drvinfo->version, NETXEN_NIC_LINUX_VERSIONID, 32); | 87 | strncpy(drvinfo->version, NETXEN_NIC_LINUX_VERSIONID, 32); |
88 | read_lock(&adapter->adapter_lock); | ||
89 | fw_major = NXRD32(adapter, NETXEN_FW_VERSION_MAJOR); | 88 | fw_major = NXRD32(adapter, NETXEN_FW_VERSION_MAJOR); |
90 | fw_minor = NXRD32(adapter, NETXEN_FW_VERSION_MINOR); | 89 | fw_minor = NXRD32(adapter, NETXEN_FW_VERSION_MINOR); |
91 | fw_build = NXRD32(adapter, NETXEN_FW_VERSION_SUB); | 90 | fw_build = NXRD32(adapter, NETXEN_FW_VERSION_SUB); |
92 | read_unlock(&adapter->adapter_lock); | ||
93 | sprintf(drvinfo->fw_version, "%d.%d.%d", fw_major, fw_minor, fw_build); | 91 | sprintf(drvinfo->fw_version, "%d.%d.%d", fw_major, fw_minor, fw_build); |
94 | 92 | ||
95 | strncpy(drvinfo->bus_info, pci_name(adapter->pdev), 32); | 93 | strncpy(drvinfo->bus_info, pci_name(adapter->pdev), 32); |
@@ -259,18 +257,18 @@ netxen_nic_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd) | |||
259 | /* read which mode */ | 257 | /* read which mode */ |
260 | if (adapter->ahw.port_type == NETXEN_NIC_GBE) { | 258 | if (adapter->ahw.port_type == NETXEN_NIC_GBE) { |
261 | /* autonegotiation */ | 259 | /* autonegotiation */ |
262 | if (adapter->phy_write | 260 | if (adapter->phy_write && |
263 | && adapter->phy_write(adapter, | 261 | adapter->phy_write(adapter, |
264 | NETXEN_NIU_GB_MII_MGMT_ADDR_AUTONEG, | 262 | NETXEN_NIU_GB_MII_MGMT_ADDR_AUTONEG, |
265 | ecmd->autoneg) != 0) | 263 | ecmd->autoneg) != 0) |
266 | return -EIO; | 264 | return -EIO; |
267 | else | 265 | else |
268 | adapter->link_autoneg = ecmd->autoneg; | 266 | adapter->link_autoneg = ecmd->autoneg; |
269 | 267 | ||
270 | if (adapter->phy_read | 268 | if (adapter->phy_read && |
271 | && adapter->phy_read(adapter, | 269 | adapter->phy_read(adapter, |
272 | NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS, | 270 | NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS, |
273 | &status) != 0) | 271 | &status) != 0) |
274 | return -EIO; | 272 | return -EIO; |
275 | 273 | ||
276 | /* speed */ | 274 | /* speed */ |
@@ -290,10 +288,10 @@ netxen_nic_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd) | |||
290 | netxen_clear_phy_duplex(status); | 288 | netxen_clear_phy_duplex(status); |
291 | if (ecmd->duplex == DUPLEX_FULL) | 289 | if (ecmd->duplex == DUPLEX_FULL) |
292 | netxen_set_phy_duplex(status); | 290 | netxen_set_phy_duplex(status); |
293 | if (adapter->phy_write | 291 | if (adapter->phy_write && |
294 | && adapter->phy_write(adapter, | 292 | adapter->phy_write(adapter, |
295 | NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS, | 293 | NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS, |
296 | *((int *)&status)) != 0) | 294 | *((int *)&status)) != 0) |
297 | return -EIO; | 295 | return -EIO; |
298 | else { | 296 | else { |
299 | adapter->link_speed = ecmd->speed; | 297 | adapter->link_speed = ecmd->speed; |
@@ -314,150 +312,91 @@ static int netxen_nic_get_regs_len(struct net_device *dev) | |||
314 | return NETXEN_NIC_REGS_LEN; | 312 | return NETXEN_NIC_REGS_LEN; |
315 | } | 313 | } |
316 | 314 | ||
317 | struct netxen_niu_regs { | ||
318 | __u32 reg[NETXEN_NIC_REGS_COUNT]; | ||
319 | }; | ||
320 | |||
321 | static struct netxen_niu_regs niu_registers[] = { | ||
322 | { | ||
323 | /* GB Mode */ | ||
324 | { | ||
325 | NETXEN_NIU_GB_SERDES_RESET, | ||
326 | NETXEN_NIU_GB0_MII_MODE, | ||
327 | NETXEN_NIU_GB1_MII_MODE, | ||
328 | NETXEN_NIU_GB2_MII_MODE, | ||
329 | NETXEN_NIU_GB3_MII_MODE, | ||
330 | NETXEN_NIU_GB0_GMII_MODE, | ||
331 | NETXEN_NIU_GB1_GMII_MODE, | ||
332 | NETXEN_NIU_GB2_GMII_MODE, | ||
333 | NETXEN_NIU_GB3_GMII_MODE, | ||
334 | NETXEN_NIU_REMOTE_LOOPBACK, | ||
335 | NETXEN_NIU_GB0_HALF_DUPLEX, | ||
336 | NETXEN_NIU_GB1_HALF_DUPLEX, | ||
337 | NETXEN_NIU_RESET_SYS_FIFOS, | ||
338 | NETXEN_NIU_GB_CRC_DROP, | ||
339 | NETXEN_NIU_GB_DROP_WRONGADDR, | ||
340 | NETXEN_NIU_TEST_MUX_CTL, | ||
341 | |||
342 | NETXEN_NIU_GB_MAC_CONFIG_0(0), | ||
343 | NETXEN_NIU_GB_MAC_CONFIG_1(0), | ||
344 | NETXEN_NIU_GB_HALF_DUPLEX_CTRL(0), | ||
345 | NETXEN_NIU_GB_MAX_FRAME_SIZE(0), | ||
346 | NETXEN_NIU_GB_TEST_REG(0), | ||
347 | NETXEN_NIU_GB_MII_MGMT_CONFIG(0), | ||
348 | NETXEN_NIU_GB_MII_MGMT_COMMAND(0), | ||
349 | NETXEN_NIU_GB_MII_MGMT_ADDR(0), | ||
350 | NETXEN_NIU_GB_MII_MGMT_CTRL(0), | ||
351 | NETXEN_NIU_GB_MII_MGMT_STATUS(0), | ||
352 | NETXEN_NIU_GB_MII_MGMT_INDICATE(0), | ||
353 | NETXEN_NIU_GB_INTERFACE_CTRL(0), | ||
354 | NETXEN_NIU_GB_INTERFACE_STATUS(0), | ||
355 | NETXEN_NIU_GB_STATION_ADDR_0(0), | ||
356 | NETXEN_NIU_GB_STATION_ADDR_1(0), | ||
357 | -1, | ||
358 | } | ||
359 | }, | ||
360 | { | ||
361 | /* XG Mode */ | ||
362 | { | ||
363 | NETXEN_NIU_XG_SINGLE_TERM, | ||
364 | NETXEN_NIU_XG_DRIVE_HI, | ||
365 | NETXEN_NIU_XG_DRIVE_LO, | ||
366 | NETXEN_NIU_XG_DTX, | ||
367 | NETXEN_NIU_XG_DEQ, | ||
368 | NETXEN_NIU_XG_WORD_ALIGN, | ||
369 | NETXEN_NIU_XG_RESET, | ||
370 | NETXEN_NIU_XG_POWER_DOWN, | ||
371 | NETXEN_NIU_XG_RESET_PLL, | ||
372 | NETXEN_NIU_XG_SERDES_LOOPBACK, | ||
373 | NETXEN_NIU_XG_DO_BYTE_ALIGN, | ||
374 | NETXEN_NIU_XG_TX_ENABLE, | ||
375 | NETXEN_NIU_XG_RX_ENABLE, | ||
376 | NETXEN_NIU_XG_STATUS, | ||
377 | NETXEN_NIU_XG_PAUSE_THRESHOLD, | ||
378 | NETXEN_NIU_XGE_CONFIG_0, | ||
379 | NETXEN_NIU_XGE_CONFIG_1, | ||
380 | NETXEN_NIU_XGE_IPG, | ||
381 | NETXEN_NIU_XGE_STATION_ADDR_0_HI, | ||
382 | NETXEN_NIU_XGE_STATION_ADDR_0_1, | ||
383 | NETXEN_NIU_XGE_STATION_ADDR_1_LO, | ||
384 | NETXEN_NIU_XGE_STATUS, | ||
385 | NETXEN_NIU_XGE_MAX_FRAME_SIZE, | ||
386 | NETXEN_NIU_XGE_PAUSE_FRAME_VALUE, | ||
387 | NETXEN_NIU_XGE_TX_BYTE_CNT, | ||
388 | NETXEN_NIU_XGE_TX_FRAME_CNT, | ||
389 | NETXEN_NIU_XGE_RX_BYTE_CNT, | ||
390 | NETXEN_NIU_XGE_RX_FRAME_CNT, | ||
391 | NETXEN_NIU_XGE_AGGR_ERROR_CNT, | ||
392 | NETXEN_NIU_XGE_MULTICAST_FRAME_CNT, | ||
393 | NETXEN_NIU_XGE_UNICAST_FRAME_CNT, | ||
394 | NETXEN_NIU_XGE_CRC_ERROR_CNT, | ||
395 | NETXEN_NIU_XGE_OVERSIZE_FRAME_ERR, | ||
396 | NETXEN_NIU_XGE_UNDERSIZE_FRAME_ERR, | ||
397 | NETXEN_NIU_XGE_LOCAL_ERROR_CNT, | ||
398 | NETXEN_NIU_XGE_REMOTE_ERROR_CNT, | ||
399 | NETXEN_NIU_XGE_CONTROL_CHAR_CNT, | ||
400 | NETXEN_NIU_XGE_PAUSE_FRAME_CNT, | ||
401 | -1, | ||
402 | } | ||
403 | } | ||
404 | }; | ||
405 | |||
406 | static void | 315 | static void |
407 | netxen_nic_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *p) | 316 | netxen_nic_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *p) |
408 | { | 317 | { |
409 | struct netxen_adapter *adapter = netdev_priv(dev); | 318 | struct netxen_adapter *adapter = netdev_priv(dev); |
410 | __u32 mode, *regs_buff = p; | 319 | struct netxen_recv_context *recv_ctx = &adapter->recv_ctx; |
411 | int i, window; | 320 | struct nx_host_sds_ring *sds_ring; |
321 | u32 *regs_buff = p; | ||
322 | int ring, i = 0; | ||
323 | int port = adapter->physical_port; | ||
412 | 324 | ||
413 | memset(p, 0, NETXEN_NIC_REGS_LEN); | 325 | memset(p, 0, NETXEN_NIC_REGS_LEN); |
326 | |||
414 | regs->version = (1 << 24) | (adapter->ahw.revision_id << 16) | | 327 | regs->version = (1 << 24) | (adapter->ahw.revision_id << 16) | |
415 | (adapter->pdev)->device; | 328 | (adapter->pdev)->device; |
416 | /* which mode */ | ||
417 | regs_buff[0] = NXRD32(adapter, NETXEN_NIU_MODE); | ||
418 | mode = regs_buff[0]; | ||
419 | |||
420 | /* Common registers to all the modes */ | ||
421 | regs_buff[2] = NXRD32(adapter, NETXEN_NIU_STRAP_VALUE_SAVE_HIGHER); | ||
422 | /* GB/XGB Mode */ | ||
423 | mode = (mode / 2) - 1; | ||
424 | window = 0; | ||
425 | if (mode <= 1) { | ||
426 | for (i = 3; niu_registers[mode].reg[i - 3] != -1; i++) { | ||
427 | /* GB: port specific registers */ | ||
428 | if (mode == 0 && i >= 19) | ||
429 | window = adapter->physical_port * | ||
430 | NETXEN_NIC_PORT_WINDOW; | ||
431 | |||
432 | regs_buff[i] = NXRD32(adapter, | ||
433 | niu_registers[mode].reg[i - 3] + window); | ||
434 | } | ||
435 | 329 | ||
330 | if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC) | ||
331 | return; | ||
332 | |||
333 | regs_buff[i++] = NXRD32(adapter, CRB_CMDPEG_STATE); | ||
334 | regs_buff[i++] = NXRD32(adapter, CRB_RCVPEG_STATE); | ||
335 | regs_buff[i++] = NXRD32(adapter, CRB_FW_CAPABILITIES_1); | ||
336 | regs_buff[i++] = NXRDIO(adapter, adapter->crb_int_state_reg); | ||
337 | regs_buff[i++] = NXRD32(adapter, NX_CRB_DEV_REF_COUNT); | ||
338 | regs_buff[i++] = NXRD32(adapter, NX_CRB_DEV_STATE); | ||
339 | regs_buff[i++] = NXRD32(adapter, NETXEN_PEG_ALIVE_COUNTER); | ||
340 | regs_buff[i++] = NXRD32(adapter, NETXEN_PEG_HALT_STATUS1); | ||
341 | regs_buff[i++] = NXRD32(adapter, NETXEN_PEG_HALT_STATUS2); | ||
342 | |||
343 | regs_buff[i++] = NXRD32(adapter, NETXEN_CRB_PEG_NET_0+0x3c); | ||
344 | regs_buff[i++] = NXRD32(adapter, NETXEN_CRB_PEG_NET_1+0x3c); | ||
345 | regs_buff[i++] = NXRD32(adapter, NETXEN_CRB_PEG_NET_2+0x3c); | ||
346 | regs_buff[i++] = NXRD32(adapter, NETXEN_CRB_PEG_NET_3+0x3c); | ||
347 | |||
348 | if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) { | ||
349 | |||
350 | regs_buff[i++] = NXRD32(adapter, NETXEN_CRB_PEG_NET_4+0x3c); | ||
351 | i += 2; | ||
352 | |||
353 | regs_buff[i++] = NXRD32(adapter, CRB_XG_STATE_P3); | ||
354 | regs_buff[i++] = le32_to_cpu(*(adapter->tx_ring->hw_consumer)); | ||
355 | |||
356 | } else { | ||
357 | i++; | ||
358 | |||
359 | regs_buff[i++] = NXRD32(adapter, | ||
360 | NETXEN_NIU_XGE_CONFIG_0+(0x10000*port)); | ||
361 | regs_buff[i++] = NXRD32(adapter, | ||
362 | NETXEN_NIU_XGE_CONFIG_1+(0x10000*port)); | ||
363 | |||
364 | regs_buff[i++] = NXRD32(adapter, CRB_XG_STATE); | ||
365 | regs_buff[i++] = NXRDIO(adapter, | ||
366 | adapter->tx_ring->crb_cmd_consumer); | ||
367 | } | ||
368 | |||
369 | regs_buff[i++] = NXRDIO(adapter, adapter->tx_ring->crb_cmd_producer); | ||
370 | |||
371 | regs_buff[i++] = NXRDIO(adapter, | ||
372 | recv_ctx->rds_rings[0].crb_rcv_producer); | ||
373 | regs_buff[i++] = NXRDIO(adapter, | ||
374 | recv_ctx->rds_rings[1].crb_rcv_producer); | ||
375 | |||
376 | regs_buff[i++] = adapter->max_sds_rings; | ||
377 | |||
378 | for (ring = 0; ring < adapter->max_sds_rings; ring++) { | ||
379 | sds_ring = &(recv_ctx->sds_rings[ring]); | ||
380 | regs_buff[i++] = NXRDIO(adapter, | ||
381 | sds_ring->crb_sts_consumer); | ||
436 | } | 382 | } |
437 | } | 383 | } |
438 | 384 | ||
439 | static u32 netxen_nic_test_link(struct net_device *dev) | 385 | static u32 netxen_nic_test_link(struct net_device *dev) |
440 | { | 386 | { |
441 | struct netxen_adapter *adapter = netdev_priv(dev); | 387 | struct netxen_adapter *adapter = netdev_priv(dev); |
442 | __u32 status; | 388 | u32 val, port; |
443 | int val; | ||
444 | 389 | ||
445 | /* read which mode */ | 390 | port = adapter->physical_port; |
446 | if (adapter->ahw.port_type == NETXEN_NIC_GBE) { | 391 | if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) { |
447 | if (adapter->phy_read | 392 | val = NXRD32(adapter, CRB_XG_STATE_P3); |
448 | && adapter->phy_read(adapter, | 393 | val = XG_LINK_STATE_P3(adapter->ahw.pci_func, val); |
449 | NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS, | 394 | return (val == XG_LINK_UP_P3) ? 0 : 1; |
450 | &status) != 0) | 395 | } else { |
451 | return -EIO; | ||
452 | else { | ||
453 | val = netxen_get_phy_link(status); | ||
454 | return !val; | ||
455 | } | ||
456 | } else if (adapter->ahw.port_type == NETXEN_NIC_XGBE) { | ||
457 | val = NXRD32(adapter, CRB_XG_STATE); | 396 | val = NXRD32(adapter, CRB_XG_STATE); |
397 | val = (val >> port*8) & 0xff; | ||
458 | return (val == XG_LINK_UP) ? 0 : 1; | 398 | return (val == XG_LINK_UP) ? 0 : 1; |
459 | } | 399 | } |
460 | return -EIO; | ||
461 | } | 400 | } |
462 | 401 | ||
463 | static int | 402 | static int |
@@ -690,8 +629,8 @@ static int netxen_nic_reg_test(struct net_device *dev) | |||
690 | u32 data_read, data_written; | 629 | u32 data_read, data_written; |
691 | 630 | ||
692 | data_read = NXRD32(adapter, NETXEN_PCIX_PH_REG(0)); | 631 | data_read = NXRD32(adapter, NETXEN_PCIX_PH_REG(0)); |
693 | if ((data_read & 0xffff) != PHAN_VENDOR_ID) | 632 | if ((data_read & 0xffff) != adapter->pdev->vendor) |
694 | return 1; | 633 | return 1; |
695 | 634 | ||
696 | data_written = (u32)0xa5a5a5a5; | 635 | data_written = (u32)0xa5a5a5a5; |
697 | 636 | ||