Skip to content

Commit 3049f0f

Browse files
committed
Merge branch '40GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-queue
Jeff Kirsher says: ==================== Intel Wired LAN Driver Updates 2020-06-11 This series contains fixes to the iavf driver. Brett fixes the supported link speeds in the iavf driver, which was only able to report speeds that the i40e driver supported and was missing the speeds supported by the ice driver. In addition, fix how 2.5 and 5.0 GbE speeds are reported. Alek fixes a enum comparison that was comparing two different enums that may have different values, so update the comparison to use matching enums. Paul increases the time to complete a reset to allow for 128 VFs to complete a reset. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 07007db + 8e3e4b9 commit 3049f0f

File tree

5 files changed

+177
-63
lines changed

5 files changed

+177
-63
lines changed

drivers/net/ethernet/intel/iavf/iavf.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ struct iavf_vsi {
8787
#define IAVF_HLUT_ARRAY_SIZE ((IAVF_VFQF_HLUT_MAX_INDEX + 1) * 4)
8888
#define IAVF_MBPS_DIVISOR 125000 /* divisor to convert to Mbps */
8989

90+
#define IAVF_VIRTCHNL_VF_RESOURCE_SIZE (sizeof(struct virtchnl_vf_resource) + \
91+
(IAVF_MAX_VF_VSI * \
92+
sizeof(struct virtchnl_vsi_resource)))
93+
9094
/* MAX_MSIX_Q_VECTORS of these are allocated,
9195
* but we only use one per queue-specific vector.
9296
*/
@@ -215,6 +219,10 @@ struct iavf_cloud_filter {
215219
bool add; /* filter needs to be added */
216220
};
217221

222+
#define IAVF_RESET_WAIT_MS 10
223+
#define IAVF_RESET_WAIT_DETECTED_COUNT 500
224+
#define IAVF_RESET_WAIT_COMPLETE_COUNT 2000
225+
218226
/* board specific private data structure */
219227
struct iavf_adapter {
220228
struct work_struct reset_task;
@@ -306,6 +314,14 @@ struct iavf_adapter {
306314
bool netdev_registered;
307315
bool link_up;
308316
enum virtchnl_link_speed link_speed;
317+
/* This is only populated if the VIRTCHNL_VF_CAP_ADV_LINK_SPEED is set
318+
* in vf_res->vf_cap_flags. Use ADV_LINK_SUPPORT macro to determine if
319+
* this field is valid. This field should be used going forward and the
320+
* enum virtchnl_link_speed above should be considered the legacy way of
321+
* storing/communicating link speeds.
322+
*/
323+
u32 link_speed_mbps;
324+
309325
enum virtchnl_ops current_op;
310326
#define CLIENT_ALLOWED(_a) ((_a)->vf_res ? \
311327
(_a)->vf_res->vf_cap_flags & \
@@ -322,6 +338,8 @@ struct iavf_adapter {
322338
VIRTCHNL_VF_OFFLOAD_RSS_PF)))
323339
#define VLAN_ALLOWED(_a) ((_a)->vf_res->vf_cap_flags & \
324340
VIRTCHNL_VF_OFFLOAD_VLAN)
341+
#define ADV_LINK_SUPPORT(_a) ((_a)->vf_res->vf_cap_flags & \
342+
VIRTCHNL_VF_CAP_ADV_LINK_SPEED)
325343
struct virtchnl_vf_resource *vf_res; /* incl. all VSIs */
326344
struct virtchnl_vsi_resource *vsi_res; /* our LAN VSI */
327345
struct virtchnl_version_info pf_version;

drivers/net/ethernet/intel/iavf/iavf_ethtool.c

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -278,35 +278,46 @@ static int iavf_get_link_ksettings(struct net_device *netdev,
278278
ethtool_link_ksettings_zero_link_mode(cmd, supported);
279279
cmd->base.autoneg = AUTONEG_DISABLE;
280280
cmd->base.port = PORT_NONE;
281-
/* Set speed and duplex */
281+
cmd->base.duplex = DUPLEX_FULL;
282+
283+
if (ADV_LINK_SUPPORT(adapter)) {
284+
if (adapter->link_speed_mbps &&
285+
adapter->link_speed_mbps < U32_MAX)
286+
cmd->base.speed = adapter->link_speed_mbps;
287+
else
288+
cmd->base.speed = SPEED_UNKNOWN;
289+
290+
return 0;
291+
}
292+
282293
switch (adapter->link_speed) {
283-
case IAVF_LINK_SPEED_40GB:
294+
case VIRTCHNL_LINK_SPEED_40GB:
284295
cmd->base.speed = SPEED_40000;
285296
break;
286-
case IAVF_LINK_SPEED_25GB:
287-
#ifdef SPEED_25000
297+
case VIRTCHNL_LINK_SPEED_25GB:
288298
cmd->base.speed = SPEED_25000;
289-
#else
290-
netdev_info(netdev,
291-
"Speed is 25G, display not supported by this version of ethtool.\n");
292-
#endif
293299
break;
294-
case IAVF_LINK_SPEED_20GB:
300+
case VIRTCHNL_LINK_SPEED_20GB:
295301
cmd->base.speed = SPEED_20000;
296302
break;
297-
case IAVF_LINK_SPEED_10GB:
303+
case VIRTCHNL_LINK_SPEED_10GB:
298304
cmd->base.speed = SPEED_10000;
299305
break;
300-
case IAVF_LINK_SPEED_1GB:
306+
case VIRTCHNL_LINK_SPEED_5GB:
307+
cmd->base.speed = SPEED_5000;
308+
break;
309+
case VIRTCHNL_LINK_SPEED_2_5GB:
310+
cmd->base.speed = SPEED_2500;
311+
break;
312+
case VIRTCHNL_LINK_SPEED_1GB:
301313
cmd->base.speed = SPEED_1000;
302314
break;
303-
case IAVF_LINK_SPEED_100MB:
315+
case VIRTCHNL_LINK_SPEED_100MB:
304316
cmd->base.speed = SPEED_100;
305317
break;
306318
default:
307319
break;
308320
}
309-
cmd->base.duplex = DUPLEX_FULL;
310321

311322
return 0;
312323
}

drivers/net/ethernet/intel/iavf/iavf_main.c

Lines changed: 41 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1756,17 +1756,17 @@ static int iavf_init_get_resources(struct iavf_adapter *adapter)
17561756
struct net_device *netdev = adapter->netdev;
17571757
struct pci_dev *pdev = adapter->pdev;
17581758
struct iavf_hw *hw = &adapter->hw;
1759-
int err = 0, bufsz;
1759+
int err;
17601760

17611761
WARN_ON(adapter->state != __IAVF_INIT_GET_RESOURCES);
17621762
/* aq msg sent, awaiting reply */
17631763
if (!adapter->vf_res) {
1764-
bufsz = sizeof(struct virtchnl_vf_resource) +
1765-
(IAVF_MAX_VF_VSI *
1766-
sizeof(struct virtchnl_vsi_resource));
1767-
adapter->vf_res = kzalloc(bufsz, GFP_KERNEL);
1768-
if (!adapter->vf_res)
1764+
adapter->vf_res = kzalloc(IAVF_VIRTCHNL_VF_RESOURCE_SIZE,
1765+
GFP_KERNEL);
1766+
if (!adapter->vf_res) {
1767+
err = -ENOMEM;
17691768
goto err;
1769+
}
17701770
}
17711771
err = iavf_get_vf_config(adapter);
17721772
if (err == IAVF_ERR_ADMIN_QUEUE_NO_WORK) {
@@ -2036,7 +2036,7 @@ static void iavf_disable_vf(struct iavf_adapter *adapter)
20362036
iavf_reset_interrupt_capability(adapter);
20372037
iavf_free_queues(adapter);
20382038
iavf_free_q_vectors(adapter);
2039-
kfree(adapter->vf_res);
2039+
memset(adapter->vf_res, 0, IAVF_VIRTCHNL_VF_RESOURCE_SIZE);
20402040
iavf_shutdown_adminq(&adapter->hw);
20412041
adapter->netdev->flags &= ~IFF_UP;
20422042
clear_bit(__IAVF_IN_CRITICAL_TASK, &adapter->crit_section);
@@ -2046,8 +2046,6 @@ static void iavf_disable_vf(struct iavf_adapter *adapter)
20462046
dev_info(&adapter->pdev->dev, "Reset task did not complete, VF disabled\n");
20472047
}
20482048

2049-
#define IAVF_RESET_WAIT_MS 10
2050-
#define IAVF_RESET_WAIT_COUNT 500
20512049
/**
20522050
* iavf_reset_task - Call-back task to handle hardware reset
20532051
* @work: pointer to work_struct
@@ -2101,20 +2099,20 @@ static void iavf_reset_task(struct work_struct *work)
21012099
adapter->flags |= IAVF_FLAG_RESET_PENDING;
21022100

21032101
/* poll until we see the reset actually happen */
2104-
for (i = 0; i < IAVF_RESET_WAIT_COUNT; i++) {
2102+
for (i = 0; i < IAVF_RESET_WAIT_DETECTED_COUNT; i++) {
21052103
reg_val = rd32(hw, IAVF_VF_ARQLEN1) &
21062104
IAVF_VF_ARQLEN1_ARQENABLE_MASK;
21072105
if (!reg_val)
21082106
break;
21092107
usleep_range(5000, 10000);
21102108
}
2111-
if (i == IAVF_RESET_WAIT_COUNT) {
2109+
if (i == IAVF_RESET_WAIT_DETECTED_COUNT) {
21122110
dev_info(&adapter->pdev->dev, "Never saw reset\n");
21132111
goto continue_reset; /* act like the reset happened */
21142112
}
21152113

21162114
/* wait until the reset is complete and the PF is responding to us */
2117-
for (i = 0; i < IAVF_RESET_WAIT_COUNT; i++) {
2115+
for (i = 0; i < IAVF_RESET_WAIT_COMPLETE_COUNT; i++) {
21182116
/* sleep first to make sure a minimum wait time is met */
21192117
msleep(IAVF_RESET_WAIT_MS);
21202118

@@ -2126,7 +2124,7 @@ static void iavf_reset_task(struct work_struct *work)
21262124

21272125
pci_set_master(adapter->pdev);
21282126

2129-
if (i == IAVF_RESET_WAIT_COUNT) {
2127+
if (i == IAVF_RESET_WAIT_COMPLETE_COUNT) {
21302128
dev_err(&adapter->pdev->dev, "Reset never finished (%x)\n",
21312129
reg_val);
21322130
iavf_disable_vf(adapter);
@@ -2487,29 +2485,46 @@ static int iavf_validate_tx_bandwidth(struct iavf_adapter *adapter,
24872485
{
24882486
int speed = 0, ret = 0;
24892487

2488+
if (ADV_LINK_SUPPORT(adapter)) {
2489+
if (adapter->link_speed_mbps < U32_MAX) {
2490+
speed = adapter->link_speed_mbps;
2491+
goto validate_bw;
2492+
} else {
2493+
dev_err(&adapter->pdev->dev, "Unknown link speed\n");
2494+
return -EINVAL;
2495+
}
2496+
}
2497+
24902498
switch (adapter->link_speed) {
2491-
case IAVF_LINK_SPEED_40GB:
2492-
speed = 40000;
2499+
case VIRTCHNL_LINK_SPEED_40GB:
2500+
speed = SPEED_40000;
2501+
break;
2502+
case VIRTCHNL_LINK_SPEED_25GB:
2503+
speed = SPEED_25000;
2504+
break;
2505+
case VIRTCHNL_LINK_SPEED_20GB:
2506+
speed = SPEED_20000;
24932507
break;
2494-
case IAVF_LINK_SPEED_25GB:
2495-
speed = 25000;
2508+
case VIRTCHNL_LINK_SPEED_10GB:
2509+
speed = SPEED_10000;
24962510
break;
2497-
case IAVF_LINK_SPEED_20GB:
2498-
speed = 20000;
2511+
case VIRTCHNL_LINK_SPEED_5GB:
2512+
speed = SPEED_5000;
24992513
break;
2500-
case IAVF_LINK_SPEED_10GB:
2501-
speed = 10000;
2514+
case VIRTCHNL_LINK_SPEED_2_5GB:
2515+
speed = SPEED_2500;
25022516
break;
2503-
case IAVF_LINK_SPEED_1GB:
2504-
speed = 1000;
2517+
case VIRTCHNL_LINK_SPEED_1GB:
2518+
speed = SPEED_1000;
25052519
break;
2506-
case IAVF_LINK_SPEED_100MB:
2507-
speed = 100;
2520+
case VIRTCHNL_LINK_SPEED_100MB:
2521+
speed = SPEED_100;
25082522
break;
25092523
default:
25102524
break;
25112525
}
25122526

2527+
validate_bw:
25132528
if (max_tx_rate > speed) {
25142529
dev_err(&adapter->pdev->dev,
25152530
"Invalid tx rate specified\n");
@@ -3412,7 +3427,7 @@ static int iavf_check_reset_complete(struct iavf_hw *hw)
34123427
u32 rstat;
34133428
int i;
34143429

3415-
for (i = 0; i < 100; i++) {
3430+
for (i = 0; i < IAVF_RESET_WAIT_COMPLETE_COUNT; i++) {
34163431
rstat = rd32(hw, IAVF_VFGEN_RSTAT) &
34173432
IAVF_VFGEN_RSTAT_VFR_STATE_MASK;
34183433
if ((rstat == VIRTCHNL_VFR_VFACTIVE) ||

drivers/net/ethernet/intel/iavf/iavf_txrx.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -379,19 +379,19 @@ static inline unsigned int iavf_itr_divisor(struct iavf_q_vector *q_vector)
379379
unsigned int divisor;
380380

381381
switch (q_vector->adapter->link_speed) {
382-
case IAVF_LINK_SPEED_40GB:
382+
case VIRTCHNL_LINK_SPEED_40GB:
383383
divisor = IAVF_ITR_ADAPTIVE_MIN_INC * 1024;
384384
break;
385-
case IAVF_LINK_SPEED_25GB:
386-
case IAVF_LINK_SPEED_20GB:
385+
case VIRTCHNL_LINK_SPEED_25GB:
386+
case VIRTCHNL_LINK_SPEED_20GB:
387387
divisor = IAVF_ITR_ADAPTIVE_MIN_INC * 512;
388388
break;
389389
default:
390-
case IAVF_LINK_SPEED_10GB:
390+
case VIRTCHNL_LINK_SPEED_10GB:
391391
divisor = IAVF_ITR_ADAPTIVE_MIN_INC * 256;
392392
break;
393-
case IAVF_LINK_SPEED_1GB:
394-
case IAVF_LINK_SPEED_100MB:
393+
case VIRTCHNL_LINK_SPEED_1GB:
394+
case VIRTCHNL_LINK_SPEED_100MB:
395395
divisor = IAVF_ITR_ADAPTIVE_MIN_INC * 32;
396396
break;
397397
}

0 commit comments

Comments
 (0)