aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/can/sja1000/sja1000_of_platform.c10
-rw-r--r--drivers/net/qlge/qlge.h16
-rw-r--r--drivers/net/qlge/qlge_ethtool.c6
-rw-r--r--drivers/net/qlge/qlge_main.c103
-rw-r--r--drivers/net/qlge/qlge_mpi.c34
5 files changed, 153 insertions, 16 deletions
diff --git a/drivers/net/can/sja1000/sja1000_of_platform.c b/drivers/net/can/sja1000/sja1000_of_platform.c
index aa953fb4b8d0..3373560405ba 100644
--- a/drivers/net/can/sja1000/sja1000_of_platform.c
+++ b/drivers/net/can/sja1000/sja1000_of_platform.c
@@ -108,15 +108,17 @@ static int __devinit sja1000_ofp_probe(struct of_device *ofdev,
108 res_size = resource_size(&res); 108 res_size = resource_size(&res);
109 109
110 if (!request_mem_region(res.start, res_size, DRV_NAME)) { 110 if (!request_mem_region(res.start, res_size, DRV_NAME)) {
111 dev_err(&ofdev->dev, "couldn't request %#x..%#x\n", 111 dev_err(&ofdev->dev, "couldn't request %#llx..%#llx\n",
112 res.start, res.end); 112 (unsigned long long)res.start,
113 (unsigned long long)res.end);
113 return -EBUSY; 114 return -EBUSY;
114 } 115 }
115 116
116 base = ioremap_nocache(res.start, res_size); 117 base = ioremap_nocache(res.start, res_size);
117 if (!base) { 118 if (!base) {
118 dev_err(&ofdev->dev, "couldn't ioremap %#x..%#x\n", 119 dev_err(&ofdev->dev, "couldn't ioremap %#llx..%#llx\n",
119 res.start, res.end); 120 (unsigned long long)res.start,
121 (unsigned long long)res.end);
120 err = -ENOMEM; 122 err = -ENOMEM;
121 goto exit_release_mem; 123 goto exit_release_mem;
122 } 124 }
diff --git a/drivers/net/qlge/qlge.h b/drivers/net/qlge/qlge.h
index e18607124f41..5eb52ca08980 100644
--- a/drivers/net/qlge/qlge.h
+++ b/drivers/net/qlge/qlge.h
@@ -65,6 +65,17 @@
65 65
66#define DB_PAGE_SIZE 4096 66#define DB_PAGE_SIZE 4096
67 67
68/* MPI test register definitions. This register
69 * is used for determining alternate NIC function's
70 * PCI->func number.
71 */
72enum {
73 MPI_TEST_FUNC_PORT_CFG = 0x1002,
74 MPI_TEST_NIC1_FUNC_SHIFT = 1,
75 MPI_TEST_NIC2_FUNC_SHIFT = 5,
76 MPI_TEST_NIC_FUNC_MASK = 0x00000007,
77};
78
68/* 79/*
69 * Processor Address Register (PROC_ADDR) bit definitions. 80 * Processor Address Register (PROC_ADDR) bit definitions.
70 */ 81 */
@@ -1430,7 +1441,10 @@ struct ql_adapter {
1430 1441
1431 /* Hardware information */ 1442 /* Hardware information */
1432 u32 chip_rev_id; 1443 u32 chip_rev_id;
1444 u32 fw_rev_id;
1433 u32 func; /* PCI function for this adapter */ 1445 u32 func; /* PCI function for this adapter */
1446 u32 alt_func; /* PCI function for alternate adapter */
1447 u32 port; /* Port number this adapter */
1434 1448
1435 spinlock_t adapter_lock; 1449 spinlock_t adapter_lock;
1436 spinlock_t hw_lock; 1450 spinlock_t hw_lock;
@@ -1580,6 +1594,8 @@ void ql_mpi_idc_work(struct work_struct *work);
1580void ql_mpi_port_cfg_work(struct work_struct *work); 1594void ql_mpi_port_cfg_work(struct work_struct *work);
1581int ql_mb_get_fw_state(struct ql_adapter *qdev); 1595int ql_mb_get_fw_state(struct ql_adapter *qdev);
1582int ql_cam_route_initialize(struct ql_adapter *qdev); 1596int ql_cam_route_initialize(struct ql_adapter *qdev);
1597int ql_read_mpi_reg(struct ql_adapter *qdev, u32 reg, u32 *data);
1598int ql_mb_about_fw(struct ql_adapter *qdev);
1583 1599
1584#if 1 1600#if 1
1585#define QL_ALL_DUMP 1601#define QL_ALL_DUMP
diff --git a/drivers/net/qlge/qlge_ethtool.c b/drivers/net/qlge/qlge_ethtool.c
index 913b2a5fafc9..37c99fe79770 100644
--- a/drivers/net/qlge/qlge_ethtool.c
+++ b/drivers/net/qlge/qlge_ethtool.c
@@ -293,7 +293,10 @@ static void ql_get_drvinfo(struct net_device *ndev,
293 struct ql_adapter *qdev = netdev_priv(ndev); 293 struct ql_adapter *qdev = netdev_priv(ndev);
294 strncpy(drvinfo->driver, qlge_driver_name, 32); 294 strncpy(drvinfo->driver, qlge_driver_name, 32);
295 strncpy(drvinfo->version, qlge_driver_version, 32); 295 strncpy(drvinfo->version, qlge_driver_version, 32);
296 strncpy(drvinfo->fw_version, "N/A", 32); 296 snprintf(drvinfo->fw_version, 32, "v%d.%d.%d",
297 (qdev->fw_rev_id & 0x00ff0000) >> 16,
298 (qdev->fw_rev_id & 0x0000ff00) >> 8,
299 (qdev->fw_rev_id & 0x000000ff));
297 strncpy(drvinfo->bus_info, pci_name(qdev->pdev), 32); 300 strncpy(drvinfo->bus_info, pci_name(qdev->pdev), 32);
298 drvinfo->n_stats = 0; 301 drvinfo->n_stats = 0;
299 drvinfo->testinfo_len = 0; 302 drvinfo->testinfo_len = 0;
@@ -401,6 +404,7 @@ const struct ethtool_ops qlge_ethtool_ops = {
401 .get_rx_csum = ql_get_rx_csum, 404 .get_rx_csum = ql_get_rx_csum,
402 .set_rx_csum = ql_set_rx_csum, 405 .set_rx_csum = ql_set_rx_csum,
403 .get_tx_csum = ethtool_op_get_tx_csum, 406 .get_tx_csum = ethtool_op_get_tx_csum,
407 .set_tx_csum = ethtool_op_set_tx_csum,
404 .get_sg = ethtool_op_get_sg, 408 .get_sg = ethtool_op_get_sg,
405 .set_sg = ethtool_op_set_sg, 409 .set_sg = ethtool_op_set_sg,
406 .get_tso = ethtool_op_get_tso, 410 .get_tso = ethtool_op_get_tso,
diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c
index 0b0778d9919c..024c7343ada0 100644
--- a/drivers/net/qlge/qlge_main.c
+++ b/drivers/net/qlge/qlge_main.c
@@ -675,11 +675,12 @@ static int ql_get_8000_flash_params(struct ql_adapter *qdev)
675 int status; 675 int status;
676 __le32 *p = (__le32 *)&qdev->flash; 676 __le32 *p = (__le32 *)&qdev->flash;
677 u32 offset; 677 u32 offset;
678 u8 mac_addr[6];
678 679
679 /* Get flash offset for function and adjust 680 /* Get flash offset for function and adjust
680 * for dword access. 681 * for dword access.
681 */ 682 */
682 if (!qdev->func) 683 if (!qdev->port)
683 offset = FUNC0_FLASH_OFFSET / sizeof(u32); 684 offset = FUNC0_FLASH_OFFSET / sizeof(u32);
684 else 685 else
685 offset = FUNC1_FLASH_OFFSET / sizeof(u32); 686 offset = FUNC1_FLASH_OFFSET / sizeof(u32);
@@ -705,14 +706,26 @@ static int ql_get_8000_flash_params(struct ql_adapter *qdev)
705 goto exit; 706 goto exit;
706 } 707 }
707 708
708 if (!is_valid_ether_addr(qdev->flash.flash_params_8000.mac_addr)) { 709 /* Extract either manufacturer or BOFM modified
710 * MAC address.
711 */
712 if (qdev->flash.flash_params_8000.data_type1 == 2)
713 memcpy(mac_addr,
714 qdev->flash.flash_params_8000.mac_addr1,
715 qdev->ndev->addr_len);
716 else
717 memcpy(mac_addr,
718 qdev->flash.flash_params_8000.mac_addr,
719 qdev->ndev->addr_len);
720
721 if (!is_valid_ether_addr(mac_addr)) {
709 QPRINTK(qdev, IFUP, ERR, "Invalid MAC address.\n"); 722 QPRINTK(qdev, IFUP, ERR, "Invalid MAC address.\n");
710 status = -EINVAL; 723 status = -EINVAL;
711 goto exit; 724 goto exit;
712 } 725 }
713 726
714 memcpy(qdev->ndev->dev_addr, 727 memcpy(qdev->ndev->dev_addr,
715 qdev->flash.flash_params_8000.mac_addr, 728 mac_addr,
716 qdev->ndev->addr_len); 729 qdev->ndev->addr_len);
717 730
718exit: 731exit:
@@ -731,7 +744,7 @@ static int ql_get_8012_flash_params(struct ql_adapter *qdev)
731 /* Second function's parameters follow the first 744 /* Second function's parameters follow the first
732 * function's. 745 * function's.
733 */ 746 */
734 if (qdev->func) 747 if (qdev->port)
735 offset = size; 748 offset = size;
736 749
737 if (ql_sem_spinlock(qdev, SEM_FLASH_MASK)) 750 if (ql_sem_spinlock(qdev, SEM_FLASH_MASK))
@@ -837,6 +850,13 @@ exit:
837static int ql_8000_port_initialize(struct ql_adapter *qdev) 850static int ql_8000_port_initialize(struct ql_adapter *qdev)
838{ 851{
839 int status; 852 int status;
853 /*
854 * Get MPI firmware version for driver banner
855 * and ethool info.
856 */
857 status = ql_mb_about_fw(qdev);
858 if (status)
859 goto exit;
840 status = ql_mb_get_fw_state(qdev); 860 status = ql_mb_get_fw_state(qdev);
841 if (status) 861 if (status)
842 goto exit; 862 goto exit;
@@ -1518,6 +1538,22 @@ static void ql_process_mac_rx_intr(struct ql_adapter *qdev,
1518 return; 1538 return;
1519 } 1539 }
1520 1540
1541 /* Frame error, so drop the packet. */
1542 if (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_ERR_MASK) {
1543 QPRINTK(qdev, DRV, ERR, "Receive error, flags2 = 0x%x\n",
1544 ib_mac_rsp->flags2);
1545 dev_kfree_skb_any(skb);
1546 return;
1547 }
1548
1549 /* The max framesize filter on this chip is set higher than
1550 * MTU since FCoE uses 2k frames.
1551 */
1552 if (skb->len > ndev->mtu + ETH_HLEN) {
1553 dev_kfree_skb_any(skb);
1554 return;
1555 }
1556
1521 prefetch(skb->data); 1557 prefetch(skb->data);
1522 skb->dev = ndev; 1558 skb->dev = ndev;
1523 if (ib_mac_rsp->flags1 & IB_MAC_IOCB_RSP_M_MASK) { 1559 if (ib_mac_rsp->flags1 & IB_MAC_IOCB_RSP_M_MASK) {
@@ -1540,7 +1576,6 @@ static void ql_process_mac_rx_intr(struct ql_adapter *qdev,
1540 * csum or frame errors. 1576 * csum or frame errors.
1541 */ 1577 */
1542 if (qdev->rx_csum && 1578 if (qdev->rx_csum &&
1543 !(ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_ERR_MASK) &&
1544 !(ib_mac_rsp->flags1 & IB_MAC_CSUM_ERR_MASK)) { 1579 !(ib_mac_rsp->flags1 & IB_MAC_CSUM_ERR_MASK)) {
1545 /* TCP frame. */ 1580 /* TCP frame. */
1546 if (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_T) { 1581 if (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_T) {
@@ -3185,9 +3220,10 @@ static void ql_display_dev_info(struct net_device *ndev)
3185 struct ql_adapter *qdev = (struct ql_adapter *)netdev_priv(ndev); 3220 struct ql_adapter *qdev = (struct ql_adapter *)netdev_priv(ndev);
3186 3221
3187 QPRINTK(qdev, PROBE, INFO, 3222 QPRINTK(qdev, PROBE, INFO,
3188 "Function #%d, NIC Roll %d, NIC Rev = %d, " 3223 "Function #%d, Port %d, NIC Roll %d, NIC Rev = %d, "
3189 "XG Roll = %d, XG Rev = %d.\n", 3224 "XG Roll = %d, XG Rev = %d.\n",
3190 qdev->func, 3225 qdev->func,
3226 qdev->port,
3191 qdev->chip_rev_id & 0x0000000f, 3227 qdev->chip_rev_id & 0x0000000f,
3192 qdev->chip_rev_id >> 4 & 0x0000000f, 3228 qdev->chip_rev_id >> 4 & 0x0000000f,
3193 qdev->chip_rev_id >> 8 & 0x0000000f, 3229 qdev->chip_rev_id >> 8 & 0x0000000f,
@@ -3263,7 +3299,6 @@ static int ql_adapter_up(struct ql_adapter *qdev)
3263 err = ql_adapter_initialize(qdev); 3299 err = ql_adapter_initialize(qdev);
3264 if (err) { 3300 if (err) {
3265 QPRINTK(qdev, IFUP, INFO, "Unable to initialize adapter.\n"); 3301 QPRINTK(qdev, IFUP, INFO, "Unable to initialize adapter.\n");
3266 spin_unlock(&qdev->hw_lock);
3267 goto err_init; 3302 goto err_init;
3268 } 3303 }
3269 set_bit(QL_ADAPTER_UP, &qdev->flags); 3304 set_bit(QL_ADAPTER_UP, &qdev->flags);
@@ -3360,7 +3395,6 @@ static int ql_configure_rings(struct ql_adapter *qdev)
3360 * completion handler rx_rings. 3395 * completion handler rx_rings.
3361 */ 3396 */
3362 qdev->rx_ring_count = qdev->tx_ring_count + qdev->rss_ring_count + 1; 3397 qdev->rx_ring_count = qdev->tx_ring_count + qdev->rss_ring_count + 1;
3363 netif_set_gso_max_size(qdev->ndev, 65536);
3364 3398
3365 for (i = 0; i < qdev->tx_ring_count; i++) { 3399 for (i = 0; i < qdev->tx_ring_count; i++) {
3366 tx_ring = &qdev->tx_ring[i]; 3400 tx_ring = &qdev->tx_ring[i];
@@ -3643,12 +3677,53 @@ static struct nic_operations qla8000_nic_ops = {
3643 .port_initialize = ql_8000_port_initialize, 3677 .port_initialize = ql_8000_port_initialize,
3644}; 3678};
3645 3679
3680/* Find the pcie function number for the other NIC
3681 * on this chip. Since both NIC functions share a
3682 * common firmware we have the lowest enabled function
3683 * do any common work. Examples would be resetting
3684 * after a fatal firmware error, or doing a firmware
3685 * coredump.
3686 */
3687static int ql_get_alt_pcie_func(struct ql_adapter *qdev)
3688{
3689 int status = 0;
3690 u32 temp;
3691 u32 nic_func1, nic_func2;
3692
3693 status = ql_read_mpi_reg(qdev, MPI_TEST_FUNC_PORT_CFG,
3694 &temp);
3695 if (status)
3696 return status;
3697
3698 nic_func1 = ((temp >> MPI_TEST_NIC1_FUNC_SHIFT) &
3699 MPI_TEST_NIC_FUNC_MASK);
3700 nic_func2 = ((temp >> MPI_TEST_NIC2_FUNC_SHIFT) &
3701 MPI_TEST_NIC_FUNC_MASK);
3702
3703 if (qdev->func == nic_func1)
3704 qdev->alt_func = nic_func2;
3705 else if (qdev->func == nic_func2)
3706 qdev->alt_func = nic_func1;
3707 else
3708 status = -EIO;
3709
3710 return status;
3711}
3646 3712
3647static void ql_get_board_info(struct ql_adapter *qdev) 3713static int ql_get_board_info(struct ql_adapter *qdev)
3648{ 3714{
3715 int status;
3649 qdev->func = 3716 qdev->func =
3650 (ql_read32(qdev, STS) & STS_FUNC_ID_MASK) >> STS_FUNC_ID_SHIFT; 3717 (ql_read32(qdev, STS) & STS_FUNC_ID_MASK) >> STS_FUNC_ID_SHIFT;
3651 if (qdev->func) { 3718 if (qdev->func > 3)
3719 return -EIO;
3720
3721 status = ql_get_alt_pcie_func(qdev);
3722 if (status)
3723 return status;
3724
3725 qdev->port = (qdev->func < qdev->alt_func) ? 0 : 1;
3726 if (qdev->port) {
3652 qdev->xg_sem_mask = SEM_XGMAC1_MASK; 3727 qdev->xg_sem_mask = SEM_XGMAC1_MASK;
3653 qdev->port_link_up = STS_PL1; 3728 qdev->port_link_up = STS_PL1;
3654 qdev->port_init = STS_PI1; 3729 qdev->port_init = STS_PI1;
@@ -3667,6 +3742,7 @@ static void ql_get_board_info(struct ql_adapter *qdev)
3667 qdev->nic_ops = &qla8012_nic_ops; 3742 qdev->nic_ops = &qla8012_nic_ops;
3668 else if (qdev->device_id == QLGE_DEVICE_ID_8000) 3743 else if (qdev->device_id == QLGE_DEVICE_ID_8000)
3669 qdev->nic_ops = &qla8000_nic_ops; 3744 qdev->nic_ops = &qla8000_nic_ops;
3745 return status;
3670} 3746}
3671 3747
3672static void ql_release_all(struct pci_dev *pdev) 3748static void ql_release_all(struct pci_dev *pdev)
@@ -3761,7 +3837,12 @@ static int __devinit ql_init_device(struct pci_dev *pdev,
3761 3837
3762 qdev->ndev = ndev; 3838 qdev->ndev = ndev;
3763 qdev->pdev = pdev; 3839 qdev->pdev = pdev;
3764 ql_get_board_info(qdev); 3840 err = ql_get_board_info(qdev);
3841 if (err) {
3842 dev_err(&pdev->dev, "Register access failed.\n");
3843 err = -EIO;
3844 goto err_out;
3845 }
3765 qdev->msg_enable = netif_msg_init(debug, default_msg); 3846 qdev->msg_enable = netif_msg_init(debug, default_msg);
3766 spin_lock_init(&qdev->hw_lock); 3847 spin_lock_init(&qdev->hw_lock);
3767 spin_lock_init(&qdev->stats_lock); 3848 spin_lock_init(&qdev->stats_lock);
diff --git a/drivers/net/qlge/qlge_mpi.c b/drivers/net/qlge/qlge_mpi.c
index 3bd60a4f5d71..a67c14a7befd 100644
--- a/drivers/net/qlge/qlge_mpi.c
+++ b/drivers/net/qlge/qlge_mpi.c
@@ -547,6 +547,40 @@ end:
547 return status; 547 return status;
548} 548}
549 549
550
551/* Get MPI firmware version. This will be used for
552 * driver banner and for ethtool info.
553 * Returns zero on success.
554 */
555int ql_mb_about_fw(struct ql_adapter *qdev)
556{
557 struct mbox_params mbc;
558 struct mbox_params *mbcp = &mbc;
559 int status = 0;
560
561 memset(mbcp, 0, sizeof(struct mbox_params));
562
563 mbcp->in_count = 1;
564 mbcp->out_count = 3;
565
566 mbcp->mbox_in[0] = MB_CMD_ABOUT_FW;
567
568 status = ql_mailbox_command(qdev, mbcp);
569 if (status)
570 return status;
571
572 if (mbcp->mbox_out[0] != MB_CMD_STS_GOOD) {
573 QPRINTK(qdev, DRV, ERR,
574 "Failed about firmware command\n");
575 status = -EIO;
576 }
577
578 /* Store the firmware version */
579 qdev->fw_rev_id = mbcp->mbox_out[1];
580
581 return status;
582}
583
550/* Get functional state for MPI firmware. 584/* Get functional state for MPI firmware.
551 * Returns zero on success. 585 * Returns zero on success.
552 */ 586 */