aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/netxen/netxen_nic_ethtool.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/netxen/netxen_nic_ethtool.c')
-rw-r--r--drivers/net/netxen/netxen_nic_ethtool.c225
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
317struct netxen_niu_regs {
318 __u32 reg[NETXEN_NIC_REGS_COUNT];
319};
320
321static 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
406static void 315static void
407netxen_nic_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *p) 316netxen_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
439static u32 netxen_nic_test_link(struct net_device *dev) 385static 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
463static int 402static 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