aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/ibm/ibmvnic.c
diff options
context:
space:
mode:
authorJohn Allen <jallen@linux.vnet.ibm.com>2017-10-26 17:23:25 -0400
committerDavid S. Miller <davem@davemloft.net>2017-10-27 11:23:58 -0400
commitc26eba03e4073bd32ef6c0ea2ba2a3ff5eed11da (patch)
treedbc073f935499df2f3fa87961b30d3d08c2f83e8 /drivers/net/ethernet/ibm/ibmvnic.c
parentc9d0dc4b119ee9cab57977924f8d9aeb2bd48eb9 (diff)
ibmvnic: Update reset infrastructure to support tunable parameters
Update ibmvnic reset infrastructure to include a new reset option that will allow changing of tunable parameters. There currently is no way to request different capabilities from the vnic server on the fly so this patch achieves this by resetting the driver and attempting to log in with the requested changes. If the reset operation fails, the old values of the tunable parameters are stored in the "fallback" struct and we attempt to login with the fallback values. Signed-off-by: John Allen <jallen@linux.vnet.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/ibm/ibmvnic.c')
-rw-r--r--drivers/net/ethernet/ibm/ibmvnic.c213
1 files changed, 186 insertions, 27 deletions
diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index 11eba8277132..3d0280196fdc 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -115,6 +115,7 @@ static int init_sub_crqs(struct ibmvnic_adapter *);
115static int init_sub_crq_irqs(struct ibmvnic_adapter *adapter); 115static int init_sub_crq_irqs(struct ibmvnic_adapter *adapter);
116static int ibmvnic_init(struct ibmvnic_adapter *); 116static int ibmvnic_init(struct ibmvnic_adapter *);
117static void release_crq_queue(struct ibmvnic_adapter *); 117static void release_crq_queue(struct ibmvnic_adapter *);
118static int __ibmvnic_set_mac(struct net_device *netdev, struct sockaddr *p);
118 119
119struct ibmvnic_stat { 120struct ibmvnic_stat {
120 char name[ETH_GSTRING_LEN]; 121 char name[ETH_GSTRING_LEN];
@@ -926,6 +927,11 @@ static int ibmvnic_open(struct net_device *netdev)
926 927
927 mutex_lock(&adapter->reset_lock); 928 mutex_lock(&adapter->reset_lock);
928 929
930 if (adapter->mac_change_pending) {
931 __ibmvnic_set_mac(netdev, &adapter->desired.mac);
932 adapter->mac_change_pending = false;
933 }
934
929 if (adapter->state != VNIC_CLOSED) { 935 if (adapter->state != VNIC_CLOSED) {
930 rc = ibmvnic_login(netdev); 936 rc = ibmvnic_login(netdev);
931 if (rc) { 937 if (rc) {
@@ -1426,7 +1432,7 @@ static void ibmvnic_set_multi(struct net_device *netdev)
1426 } 1432 }
1427} 1433}
1428 1434
1429static int ibmvnic_set_mac(struct net_device *netdev, void *p) 1435static int __ibmvnic_set_mac(struct net_device *netdev, struct sockaddr *p)
1430{ 1436{
1431 struct ibmvnic_adapter *adapter = netdev_priv(netdev); 1437 struct ibmvnic_adapter *adapter = netdev_priv(netdev);
1432 struct sockaddr *addr = p; 1438 struct sockaddr *addr = p;
@@ -1444,6 +1450,22 @@ static int ibmvnic_set_mac(struct net_device *netdev, void *p)
1444 return 0; 1450 return 0;
1445} 1451}
1446 1452
1453static int ibmvnic_set_mac(struct net_device *netdev, void *p)
1454{
1455 struct ibmvnic_adapter *adapter = netdev_priv(netdev);
1456 struct sockaddr *addr = p;
1457
1458 if (adapter->state != VNIC_OPEN) {
1459 memcpy(&adapter->desired.mac, addr, sizeof(struct sockaddr));
1460 adapter->mac_change_pending = true;
1461 return 0;
1462 }
1463
1464 __ibmvnic_set_mac(netdev, addr);
1465
1466 return 0;
1467}
1468
1447/** 1469/**
1448 * do_reset returns zero if we are able to keep processing reset events, or 1470 * do_reset returns zero if we are able to keep processing reset events, or
1449 * non-zero if we hit a fatal error and must halt. 1471 * non-zero if we hit a fatal error and must halt.
@@ -1470,6 +1492,13 @@ static int do_reset(struct ibmvnic_adapter *adapter,
1470 if (rc) 1492 if (rc)
1471 return rc; 1493 return rc;
1472 1494
1495 if (adapter->reset_reason == VNIC_RESET_CHANGE_PARAM ||
1496 adapter->wait_for_reset) {
1497 release_resources(adapter);
1498 release_sub_crqs(adapter);
1499 release_crq_queue(adapter);
1500 }
1501
1473 if (adapter->reset_reason != VNIC_RESET_NON_FATAL) { 1502 if (adapter->reset_reason != VNIC_RESET_NON_FATAL) {
1474 /* remove the closed state so when we call open it appears 1503 /* remove the closed state so when we call open it appears
1475 * we are coming from the probed state. 1504 * we are coming from the probed state.
@@ -1492,16 +1521,23 @@ static int do_reset(struct ibmvnic_adapter *adapter,
1492 return 0; 1521 return 0;
1493 } 1522 }
1494 1523
1495 rc = reset_tx_pools(adapter); 1524 if (adapter->reset_reason == VNIC_RESET_CHANGE_PARAM ||
1496 if (rc) 1525 adapter->wait_for_reset) {
1497 return rc; 1526 rc = init_resources(adapter);
1527 if (rc)
1528 return rc;
1529 } else {
1530 rc = reset_tx_pools(adapter);
1531 if (rc)
1532 return rc;
1498 1533
1499 rc = reset_rx_pools(adapter); 1534 rc = reset_rx_pools(adapter);
1500 if (rc) 1535 if (rc)
1501 return rc; 1536 return rc;
1502 1537
1503 if (reset_state == VNIC_CLOSED) 1538 if (reset_state == VNIC_CLOSED)
1504 return 0; 1539 return 0;
1540 }
1505 } 1541 }
1506 1542
1507 rc = __ibmvnic_open(netdev); 1543 rc = __ibmvnic_open(netdev);
@@ -1561,7 +1597,7 @@ static void __ibmvnic_reset(struct work_struct *work)
1561 struct ibmvnic_adapter *adapter; 1597 struct ibmvnic_adapter *adapter;
1562 struct net_device *netdev; 1598 struct net_device *netdev;
1563 u32 reset_state; 1599 u32 reset_state;
1564 int rc; 1600 int rc = 0;
1565 1601
1566 adapter = container_of(work, struct ibmvnic_adapter, ibmvnic_reset); 1602 adapter = container_of(work, struct ibmvnic_adapter, ibmvnic_reset);
1567 netdev = adapter->netdev; 1603 netdev = adapter->netdev;
@@ -1580,6 +1616,12 @@ static void __ibmvnic_reset(struct work_struct *work)
1580 rwi = get_next_rwi(adapter); 1616 rwi = get_next_rwi(adapter);
1581 } 1617 }
1582 1618
1619 if (adapter->wait_for_reset) {
1620 adapter->wait_for_reset = false;
1621 adapter->reset_done_rc = rc;
1622 complete(&adapter->reset_done);
1623 }
1624
1583 if (rc) { 1625 if (rc) {
1584 netdev_dbg(adapter->netdev, "Reset failed\n"); 1626 netdev_dbg(adapter->netdev, "Reset failed\n");
1585 free_all_rwi(adapter); 1627 free_all_rwi(adapter);
@@ -1759,9 +1801,42 @@ static void ibmvnic_netpoll_controller(struct net_device *dev)
1759} 1801}
1760#endif 1802#endif
1761 1803
1804static int wait_for_reset(struct ibmvnic_adapter *adapter)
1805{
1806 adapter->fallback.mtu = adapter->req_mtu;
1807 adapter->fallback.rx_queues = adapter->req_rx_queues;
1808 adapter->fallback.tx_queues = adapter->req_tx_queues;
1809 adapter->fallback.rx_entries = adapter->req_rx_add_entries_per_subcrq;
1810 adapter->fallback.tx_entries = adapter->req_tx_entries_per_subcrq;
1811
1812 init_completion(&adapter->reset_done);
1813 ibmvnic_reset(adapter, VNIC_RESET_CHANGE_PARAM);
1814 adapter->wait_for_reset = true;
1815 wait_for_completion(&adapter->reset_done);
1816
1817 if (adapter->reset_done_rc) {
1818 adapter->desired.mtu = adapter->fallback.mtu;
1819 adapter->desired.rx_queues = adapter->fallback.rx_queues;
1820 adapter->desired.tx_queues = adapter->fallback.tx_queues;
1821 adapter->desired.rx_entries = adapter->fallback.rx_entries;
1822 adapter->desired.tx_entries = adapter->fallback.tx_entries;
1823
1824 init_completion(&adapter->reset_done);
1825 ibmvnic_reset(adapter, VNIC_RESET_CHANGE_PARAM);
1826 wait_for_completion(&adapter->reset_done);
1827 }
1828 adapter->wait_for_reset = false;
1829
1830 return adapter->reset_done_rc;
1831}
1832
1762static int ibmvnic_change_mtu(struct net_device *netdev, int new_mtu) 1833static int ibmvnic_change_mtu(struct net_device *netdev, int new_mtu)
1763{ 1834{
1764 return -EOPNOTSUPP; 1835 struct ibmvnic_adapter *adapter = netdev_priv(netdev);
1836
1837 adapter->desired.mtu = new_mtu + ETH_HLEN;
1838
1839 return wait_for_reset(adapter);
1765} 1840}
1766 1841
1767static const struct net_device_ops ibmvnic_netdev_ops = { 1842static const struct net_device_ops ibmvnic_netdev_ops = {
@@ -1849,6 +1924,27 @@ static void ibmvnic_get_ringparam(struct net_device *netdev,
1849 ring->rx_jumbo_pending = 0; 1924 ring->rx_jumbo_pending = 0;
1850} 1925}
1851 1926
1927static int ibmvnic_set_ringparam(struct net_device *netdev,
1928 struct ethtool_ringparam *ring)
1929{
1930 struct ibmvnic_adapter *adapter = netdev_priv(netdev);
1931
1932 if (ring->rx_pending > adapter->max_rx_add_entries_per_subcrq ||
1933 ring->tx_pending > adapter->max_tx_entries_per_subcrq) {
1934 netdev_err(netdev, "Invalid request.\n");
1935 netdev_err(netdev, "Max tx buffers = %llu\n",
1936 adapter->max_rx_add_entries_per_subcrq);
1937 netdev_err(netdev, "Max rx buffers = %llu\n",
1938 adapter->max_tx_entries_per_subcrq);
1939 return -EINVAL;
1940 }
1941
1942 adapter->desired.rx_entries = ring->rx_pending;
1943 adapter->desired.tx_entries = ring->tx_pending;
1944
1945 return wait_for_reset(adapter);
1946}
1947
1852static void ibmvnic_get_channels(struct net_device *netdev, 1948static void ibmvnic_get_channels(struct net_device *netdev,
1853 struct ethtool_channels *channels) 1949 struct ethtool_channels *channels)
1854{ 1950{
@@ -1864,6 +1960,17 @@ static void ibmvnic_get_channels(struct net_device *netdev,
1864 channels->combined_count = 0; 1960 channels->combined_count = 0;
1865} 1961}
1866 1962
1963static int ibmvnic_set_channels(struct net_device *netdev,
1964 struct ethtool_channels *channels)
1965{
1966 struct ibmvnic_adapter *adapter = netdev_priv(netdev);
1967
1968 adapter->desired.rx_queues = channels->rx_count;
1969 adapter->desired.tx_queues = channels->tx_count;
1970
1971 return wait_for_reset(adapter);
1972}
1973
1867static void ibmvnic_get_strings(struct net_device *dev, u32 stringset, u8 *data) 1974static void ibmvnic_get_strings(struct net_device *dev, u32 stringset, u8 *data)
1868{ 1975{
1869 struct ibmvnic_adapter *adapter = netdev_priv(dev); 1976 struct ibmvnic_adapter *adapter = netdev_priv(dev);
@@ -1960,7 +2067,9 @@ static const struct ethtool_ops ibmvnic_ethtool_ops = {
1960 .set_msglevel = ibmvnic_set_msglevel, 2067 .set_msglevel = ibmvnic_set_msglevel,
1961 .get_link = ibmvnic_get_link, 2068 .get_link = ibmvnic_get_link,
1962 .get_ringparam = ibmvnic_get_ringparam, 2069 .get_ringparam = ibmvnic_get_ringparam,
2070 .set_ringparam = ibmvnic_set_ringparam,
1963 .get_channels = ibmvnic_get_channels, 2071 .get_channels = ibmvnic_get_channels,
2072 .set_channels = ibmvnic_set_channels,
1964 .get_strings = ibmvnic_get_strings, 2073 .get_strings = ibmvnic_get_strings,
1965 .get_sset_count = ibmvnic_get_sset_count, 2074 .get_sset_count = ibmvnic_get_sset_count,
1966 .get_ethtool_stats = ibmvnic_get_ethtool_stats, 2075 .get_ethtool_stats = ibmvnic_get_ethtool_stats,
@@ -2426,6 +2535,7 @@ static void ibmvnic_send_req_caps(struct ibmvnic_adapter *adapter, int retry)
2426{ 2535{
2427 struct device *dev = &adapter->vdev->dev; 2536 struct device *dev = &adapter->vdev->dev;
2428 union ibmvnic_crq crq; 2537 union ibmvnic_crq crq;
2538 int max_entries;
2429 2539
2430 if (!retry) { 2540 if (!retry) {
2431 /* Sub-CRQ entries are 32 byte long */ 2541 /* Sub-CRQ entries are 32 byte long */
@@ -2437,21 +2547,60 @@ static void ibmvnic_send_req_caps(struct ibmvnic_adapter *adapter, int retry)
2437 return; 2547 return;
2438 } 2548 }
2439 2549
2440 /* Get the minimum between the queried max and the entries 2550 if (adapter->desired.mtu)
2441 * that fit in our PAGE_SIZE 2551 adapter->req_mtu = adapter->desired.mtu;
2442 */ 2552 else
2443 adapter->req_tx_entries_per_subcrq = 2553 adapter->req_mtu = adapter->netdev->mtu + ETH_HLEN;
2444 adapter->max_tx_entries_per_subcrq > entries_page ? 2554
2445 entries_page : adapter->max_tx_entries_per_subcrq; 2555 if (!adapter->desired.tx_entries)
2446 adapter->req_rx_add_entries_per_subcrq = 2556 adapter->desired.tx_entries =
2447 adapter->max_rx_add_entries_per_subcrq > entries_page ? 2557 adapter->max_tx_entries_per_subcrq;
2448 entries_page : adapter->max_rx_add_entries_per_subcrq; 2558 if (!adapter->desired.rx_entries)
2449 2559 adapter->desired.rx_entries =
2450 adapter->req_tx_queues = adapter->opt_tx_comp_sub_queues; 2560 adapter->max_rx_add_entries_per_subcrq;
2451 adapter->req_rx_queues = adapter->opt_rx_comp_queues; 2561
2452 adapter->req_rx_add_queues = adapter->max_rx_add_queues; 2562 max_entries = IBMVNIC_MAX_LTB_SIZE /
2563 (adapter->req_mtu + IBMVNIC_BUFFER_HLEN);
2564
2565 if ((adapter->req_mtu + IBMVNIC_BUFFER_HLEN) *
2566 adapter->desired.tx_entries > IBMVNIC_MAX_LTB_SIZE) {
2567 adapter->desired.tx_entries = max_entries;
2568 }
2453 2569
2454 adapter->req_mtu = adapter->netdev->mtu + ETH_HLEN; 2570 if ((adapter->req_mtu + IBMVNIC_BUFFER_HLEN) *
2571 adapter->desired.rx_entries > IBMVNIC_MAX_LTB_SIZE) {
2572 adapter->desired.rx_entries = max_entries;
2573 }
2574
2575 if (adapter->desired.tx_entries)
2576 adapter->req_tx_entries_per_subcrq =
2577 adapter->desired.tx_entries;
2578 else
2579 adapter->req_tx_entries_per_subcrq =
2580 adapter->max_tx_entries_per_subcrq;
2581
2582 if (adapter->desired.rx_entries)
2583 adapter->req_rx_add_entries_per_subcrq =
2584 adapter->desired.rx_entries;
2585 else
2586 adapter->req_rx_add_entries_per_subcrq =
2587 adapter->max_rx_add_entries_per_subcrq;
2588
2589 if (adapter->desired.tx_queues)
2590 adapter->req_tx_queues =
2591 adapter->desired.tx_queues;
2592 else
2593 adapter->req_tx_queues =
2594 adapter->opt_tx_comp_sub_queues;
2595
2596 if (adapter->desired.rx_queues)
2597 adapter->req_rx_queues =
2598 adapter->desired.rx_queues;
2599 else
2600 adapter->req_rx_queues =
2601 adapter->opt_rx_comp_queues;
2602
2603 adapter->req_rx_add_queues = adapter->max_rx_add_queues;
2455 } 2604 }
2456 2605
2457 memset(&crq, 0, sizeof(crq)); 2606 memset(&crq, 0, sizeof(crq));
@@ -3272,6 +3421,7 @@ static int handle_login_rsp(union ibmvnic_crq *login_rsp_crq,
3272 struct ibmvnic_adapter *adapter) 3421 struct ibmvnic_adapter *adapter)
3273{ 3422{
3274 struct device *dev = &adapter->vdev->dev; 3423 struct device *dev = &adapter->vdev->dev;
3424 struct net_device *netdev = adapter->netdev;
3275 struct ibmvnic_login_rsp_buffer *login_rsp = adapter->login_rsp_buf; 3425 struct ibmvnic_login_rsp_buffer *login_rsp = adapter->login_rsp_buf;
3276 struct ibmvnic_login_buffer *login = adapter->login_buf; 3426 struct ibmvnic_login_buffer *login = adapter->login_buf;
3277 int i; 3427 int i;
@@ -3291,6 +3441,8 @@ static int handle_login_rsp(union ibmvnic_crq *login_rsp_crq,
3291 return 0; 3441 return 0;
3292 } 3442 }
3293 3443
3444 netdev->mtu = adapter->req_mtu - ETH_HLEN;
3445
3294 netdev_dbg(adapter->netdev, "Login Response Buffer:\n"); 3446 netdev_dbg(adapter->netdev, "Login Response Buffer:\n");
3295 for (i = 0; i < (adapter->login_rsp_buf_sz - 1) / 8 + 1; i++) { 3447 for (i = 0; i < (adapter->login_rsp_buf_sz - 1) / 8 + 1; i++) {
3296 netdev_dbg(adapter->netdev, "%016lx\n", 3448 netdev_dbg(adapter->netdev, "%016lx\n",
@@ -3846,7 +3998,7 @@ static int ibmvnic_init(struct ibmvnic_adapter *adapter)
3846 unsigned long timeout = msecs_to_jiffies(30000); 3998 unsigned long timeout = msecs_to_jiffies(30000);
3847 int rc; 3999 int rc;
3848 4000
3849 if (adapter->resetting) { 4001 if (adapter->resetting && !adapter->wait_for_reset) {
3850 rc = ibmvnic_reset_crq(adapter); 4002 rc = ibmvnic_reset_crq(adapter);
3851 if (!rc) 4003 if (!rc)
3852 rc = vio_enable_interrupts(adapter->vdev); 4004 rc = vio_enable_interrupts(adapter->vdev);
@@ -3880,7 +4032,7 @@ static int ibmvnic_init(struct ibmvnic_adapter *adapter)
3880 return -1; 4032 return -1;
3881 } 4033 }
3882 4034
3883 if (adapter->resetting) 4035 if (adapter->resetting && !adapter->wait_for_reset)
3884 rc = reset_sub_crq_queues(adapter); 4036 rc = reset_sub_crq_queues(adapter);
3885 else 4037 else
3886 rc = init_sub_crqs(adapter); 4038 rc = init_sub_crqs(adapter);
@@ -3949,6 +4101,8 @@ static int ibmvnic_probe(struct vio_dev *dev, const struct vio_device_id *id)
3949 mutex_init(&adapter->rwi_lock); 4101 mutex_init(&adapter->rwi_lock);
3950 adapter->resetting = false; 4102 adapter->resetting = false;
3951 4103
4104 adapter->mac_change_pending = false;
4105
3952 do { 4106 do {
3953 rc = ibmvnic_init(adapter); 4107 rc = ibmvnic_init(adapter);
3954 if (rc && rc != EAGAIN) 4108 if (rc && rc != EAGAIN)
@@ -3956,6 +4110,8 @@ static int ibmvnic_probe(struct vio_dev *dev, const struct vio_device_id *id)
3956 } while (rc == EAGAIN); 4110 } while (rc == EAGAIN);
3957 4111
3958 netdev->mtu = adapter->req_mtu - ETH_HLEN; 4112 netdev->mtu = adapter->req_mtu - ETH_HLEN;
4113 netdev->min_mtu = adapter->min_mtu - ETH_HLEN;
4114 netdev->max_mtu = adapter->max_mtu - ETH_HLEN;
3959 4115
3960 rc = device_create_file(&dev->dev, &dev_attr_failover); 4116 rc = device_create_file(&dev->dev, &dev_attr_failover);
3961 if (rc) 4117 if (rc)
@@ -3970,6 +4126,9 @@ static int ibmvnic_probe(struct vio_dev *dev, const struct vio_device_id *id)
3970 dev_info(&dev->dev, "ibmvnic registered\n"); 4126 dev_info(&dev->dev, "ibmvnic registered\n");
3971 4127
3972 adapter->state = VNIC_PROBED; 4128 adapter->state = VNIC_PROBED;
4129
4130 adapter->wait_for_reset = false;
4131
3973 return 0; 4132 return 0;
3974 4133
3975ibmvnic_register_fail: 4134ibmvnic_register_fail: