Skip to content

Commit c5b1567

Browse files
committed
Merge branch 'mlx4'
Or Gerlitz says: ==================== Here's a batch of fixes to the mlx4 core and ethernet drivers for 3.9 The commit that disabled RFS when running in SRIOV mode fixes a regression which was introduced in 3.9-rc1 but actually present also in the 3.8 -stable series. It turns out that a slightly different fix is needed there and we will generate and submit it there. Patches done against net commit 66d29cb "benet: Wait f/w POST until timeout" ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
2 parents 43b18db + a229e48 commit c5b1567

12 files changed

Lines changed: 75 additions & 59 deletions

File tree

drivers/net/ethernet/mellanox/mlx4/cq.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ void __mlx4_cq_free_icm(struct mlx4_dev *dev, int cqn)
226226

227227
static void mlx4_cq_free_icm(struct mlx4_dev *dev, int cqn)
228228
{
229-
u64 in_param;
229+
u64 in_param = 0;
230230
int err;
231231

232232
if (mlx4_is_mfunc(dev)) {

drivers/net/ethernet/mellanox/mlx4/en_netdev.c

Lines changed: 46 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -565,34 +565,38 @@ static void mlx4_en_put_qp(struct mlx4_en_priv *priv)
565565
struct mlx4_en_dev *mdev = priv->mdev;
566566
struct mlx4_dev *dev = mdev->dev;
567567
int qpn = priv->base_qpn;
568-
u64 mac = mlx4_en_mac_to_u64(priv->dev->dev_addr);
569-
570-
en_dbg(DRV, priv, "Registering MAC: %pM for deleting\n",
571-
priv->dev->dev_addr);
572-
mlx4_unregister_mac(dev, priv->port, mac);
568+
u64 mac;
573569

574-
if (dev->caps.steering_mode != MLX4_STEERING_MODE_A0) {
570+
if (dev->caps.steering_mode == MLX4_STEERING_MODE_A0) {
571+
mac = mlx4_en_mac_to_u64(priv->dev->dev_addr);
572+
en_dbg(DRV, priv, "Registering MAC: %pM for deleting\n",
573+
priv->dev->dev_addr);
574+
mlx4_unregister_mac(dev, priv->port, mac);
575+
} else {
575576
struct mlx4_mac_entry *entry;
576577
struct hlist_node *tmp;
577578
struct hlist_head *bucket;
578-
unsigned int mac_hash;
579+
unsigned int i;
579580

580-
mac_hash = priv->dev->dev_addr[MLX4_EN_MAC_HASH_IDX];
581-
bucket = &priv->mac_hash[mac_hash];
582-
hlist_for_each_entry_safe(entry, tmp, bucket, hlist) {
583-
if (ether_addr_equal_64bits(entry->mac,
584-
priv->dev->dev_addr)) {
585-
en_dbg(DRV, priv, "Releasing qp: port %d, MAC %pM, qpn %d\n",
586-
priv->port, priv->dev->dev_addr, qpn);
581+
for (i = 0; i < MLX4_EN_MAC_HASH_SIZE; ++i) {
582+
bucket = &priv->mac_hash[i];
583+
hlist_for_each_entry_safe(entry, tmp, bucket, hlist) {
584+
mac = mlx4_en_mac_to_u64(entry->mac);
585+
en_dbg(DRV, priv, "Registering MAC: %pM for deleting\n",
586+
entry->mac);
587587
mlx4_en_uc_steer_release(priv, entry->mac,
588588
qpn, entry->reg_id);
589-
mlx4_qp_release_range(dev, qpn, 1);
590589

590+
mlx4_unregister_mac(dev, priv->port, mac);
591591
hlist_del_rcu(&entry->hlist);
592592
kfree_rcu(entry, rcu);
593-
break;
594593
}
595594
}
595+
596+
en_dbg(DRV, priv, "Releasing qp: port %d, qpn %d\n",
597+
priv->port, qpn);
598+
mlx4_qp_release_range(dev, qpn, 1);
599+
priv->flags &= ~MLX4_EN_FLAG_FORCE_PROMISC;
596600
}
597601
}
598602

@@ -650,28 +654,10 @@ u64 mlx4_en_mac_to_u64(u8 *addr)
650654
return mac;
651655
}
652656

653-
static int mlx4_en_set_mac(struct net_device *dev, void *addr)
654-
{
655-
struct mlx4_en_priv *priv = netdev_priv(dev);
656-
struct mlx4_en_dev *mdev = priv->mdev;
657-
struct sockaddr *saddr = addr;
658-
659-
if (!is_valid_ether_addr(saddr->sa_data))
660-
return -EADDRNOTAVAIL;
661-
662-
memcpy(dev->dev_addr, saddr->sa_data, ETH_ALEN);
663-
queue_work(mdev->workqueue, &priv->mac_task);
664-
return 0;
665-
}
666-
667-
static void mlx4_en_do_set_mac(struct work_struct *work)
657+
static int mlx4_en_do_set_mac(struct mlx4_en_priv *priv)
668658
{
669-
struct mlx4_en_priv *priv = container_of(work, struct mlx4_en_priv,
670-
mac_task);
671-
struct mlx4_en_dev *mdev = priv->mdev;
672659
int err = 0;
673660

674-
mutex_lock(&mdev->state_lock);
675661
if (priv->port_up) {
676662
/* Remove old MAC and insert the new one */
677663
err = mlx4_en_replace_mac(priv, priv->base_qpn,
@@ -683,7 +669,26 @@ static void mlx4_en_do_set_mac(struct work_struct *work)
683669
} else
684670
en_dbg(HW, priv, "Port is down while registering mac, exiting...\n");
685671

672+
return err;
673+
}
674+
675+
static int mlx4_en_set_mac(struct net_device *dev, void *addr)
676+
{
677+
struct mlx4_en_priv *priv = netdev_priv(dev);
678+
struct mlx4_en_dev *mdev = priv->mdev;
679+
struct sockaddr *saddr = addr;
680+
int err;
681+
682+
if (!is_valid_ether_addr(saddr->sa_data))
683+
return -EADDRNOTAVAIL;
684+
685+
memcpy(dev->dev_addr, saddr->sa_data, ETH_ALEN);
686+
687+
mutex_lock(&mdev->state_lock);
688+
err = mlx4_en_do_set_mac(priv);
686689
mutex_unlock(&mdev->state_lock);
690+
691+
return err;
687692
}
688693

689694
static void mlx4_en_clear_list(struct net_device *dev)
@@ -1348,7 +1353,7 @@ static void mlx4_en_do_get_stats(struct work_struct *work)
13481353
queue_delayed_work(mdev->workqueue, &priv->stats_task, STATS_DELAY);
13491354
}
13501355
if (mdev->mac_removed[MLX4_MAX_PORTS + 1 - priv->port]) {
1351-
queue_work(mdev->workqueue, &priv->mac_task);
1356+
mlx4_en_do_set_mac(priv);
13521357
mdev->mac_removed[MLX4_MAX_PORTS + 1 - priv->port] = 0;
13531358
}
13541359
mutex_unlock(&mdev->state_lock);
@@ -1828,9 +1833,11 @@ int mlx4_en_alloc_resources(struct mlx4_en_priv *priv)
18281833
}
18291834

18301835
#ifdef CONFIG_RFS_ACCEL
1831-
priv->dev->rx_cpu_rmap = alloc_irq_cpu_rmap(priv->mdev->dev->caps.comp_pool);
1832-
if (!priv->dev->rx_cpu_rmap)
1833-
goto err;
1836+
if (priv->mdev->dev->caps.comp_pool) {
1837+
priv->dev->rx_cpu_rmap = alloc_irq_cpu_rmap(priv->mdev->dev->caps.comp_pool);
1838+
if (!priv->dev->rx_cpu_rmap)
1839+
goto err;
1840+
}
18341841
#endif
18351842

18361843
return 0;
@@ -2078,7 +2085,6 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
20782085
priv->msg_enable = MLX4_EN_MSG_LEVEL;
20792086
spin_lock_init(&priv->stats_lock);
20802087
INIT_WORK(&priv->rx_mode_task, mlx4_en_do_set_rx_mode);
2081-
INIT_WORK(&priv->mac_task, mlx4_en_do_set_mac);
20822088
INIT_WORK(&priv->watchdog_task, mlx4_en_restart);
20832089
INIT_WORK(&priv->linkstate_task, mlx4_en_linkstate);
20842090
INIT_DELAYED_WORK(&priv->stats_task, mlx4_en_do_get_stats);

drivers/net/ethernet/mellanox/mlx4/fw.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -787,6 +787,14 @@ int mlx4_QUERY_DEV_CAP_wrapper(struct mlx4_dev *dev, int slave,
787787
bmme_flags &= ~MLX4_BMME_FLAG_TYPE_2_WIN;
788788
MLX4_PUT(outbox->buf, bmme_flags, QUERY_DEV_CAP_BMME_FLAGS_OFFSET);
789789

790+
/* turn off device-managed steering capability if not enabled */
791+
if (dev->caps.steering_mode != MLX4_STEERING_MODE_DEVICE_MANAGED) {
792+
MLX4_GET(field, outbox->buf,
793+
QUERY_DEV_CAP_FLOW_STEERING_RANGE_EN_OFFSET);
794+
field &= 0x7f;
795+
MLX4_PUT(outbox->buf, field,
796+
QUERY_DEV_CAP_FLOW_STEERING_RANGE_EN_OFFSET);
797+
}
790798
return 0;
791799
}
792800

drivers/net/ethernet/mellanox/mlx4/main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1555,7 +1555,7 @@ void __mlx4_counter_free(struct mlx4_dev *dev, u32 idx)
15551555

15561556
void mlx4_counter_free(struct mlx4_dev *dev, u32 idx)
15571557
{
1558-
u64 in_param;
1558+
u64 in_param = 0;
15591559

15601560
if (mlx4_is_mfunc(dev)) {
15611561
set_param_l(&in_param, idx);

drivers/net/ethernet/mellanox/mlx4/mlx4.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1235,7 +1235,7 @@ int mlx4_get_qp_per_mgm(struct mlx4_dev *dev);
12351235

12361236
static inline void set_param_l(u64 *arg, u32 val)
12371237
{
1238-
*((u32 *)arg) = val;
1238+
*arg = (*arg & 0xffffffff00000000ULL) | (u64) val;
12391239
}
12401240

12411241
static inline void set_param_h(u64 *arg, u32 val)

drivers/net/ethernet/mellanox/mlx4/mlx4_en.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -509,7 +509,6 @@ struct mlx4_en_priv {
509509
struct mlx4_en_cq rx_cq[MAX_RX_RINGS];
510510
struct mlx4_qp drop_qp;
511511
struct work_struct rx_mode_task;
512-
struct work_struct mac_task;
513512
struct work_struct watchdog_task;
514513
struct work_struct linkstate_task;
515514
struct delayed_work stats_task;

drivers/net/ethernet/mellanox/mlx4/mr.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ u32 __mlx4_alloc_mtt_range(struct mlx4_dev *dev, int order)
183183

184184
static u32 mlx4_alloc_mtt_range(struct mlx4_dev *dev, int order)
185185
{
186-
u64 in_param;
186+
u64 in_param = 0;
187187
u64 out_param;
188188
int err;
189189

@@ -240,7 +240,7 @@ void __mlx4_free_mtt_range(struct mlx4_dev *dev, u32 offset, int order)
240240

241241
static void mlx4_free_mtt_range(struct mlx4_dev *dev, u32 offset, int order)
242242
{
243-
u64 in_param;
243+
u64 in_param = 0;
244244
int err;
245245

246246
if (mlx4_is_mfunc(dev)) {
@@ -351,7 +351,7 @@ void __mlx4_mpt_release(struct mlx4_dev *dev, u32 index)
351351

352352
static void mlx4_mpt_release(struct mlx4_dev *dev, u32 index)
353353
{
354-
u64 in_param;
354+
u64 in_param = 0;
355355

356356
if (mlx4_is_mfunc(dev)) {
357357
set_param_l(&in_param, index);
@@ -374,7 +374,7 @@ int __mlx4_mpt_alloc_icm(struct mlx4_dev *dev, u32 index)
374374

375375
static int mlx4_mpt_alloc_icm(struct mlx4_dev *dev, u32 index)
376376
{
377-
u64 param;
377+
u64 param = 0;
378378

379379
if (mlx4_is_mfunc(dev)) {
380380
set_param_l(&param, index);
@@ -395,7 +395,7 @@ void __mlx4_mpt_free_icm(struct mlx4_dev *dev, u32 index)
395395

396396
static void mlx4_mpt_free_icm(struct mlx4_dev *dev, u32 index)
397397
{
398-
u64 in_param;
398+
u64 in_param = 0;
399399

400400
if (mlx4_is_mfunc(dev)) {
401401
set_param_l(&in_param, index);

drivers/net/ethernet/mellanox/mlx4/pd.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ void __mlx4_xrcd_free(struct mlx4_dev *dev, u32 xrcdn)
101101

102102
void mlx4_xrcd_free(struct mlx4_dev *dev, u32 xrcdn)
103103
{
104-
u64 in_param;
104+
u64 in_param = 0;
105105
int err;
106106

107107
if (mlx4_is_mfunc(dev)) {

drivers/net/ethernet/mellanox/mlx4/port.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ EXPORT_SYMBOL_GPL(__mlx4_register_mac);
175175

176176
int mlx4_register_mac(struct mlx4_dev *dev, u8 port, u64 mac)
177177
{
178-
u64 out_param;
178+
u64 out_param = 0;
179179
int err;
180180

181181
if (mlx4_is_mfunc(dev)) {
@@ -222,7 +222,7 @@ EXPORT_SYMBOL_GPL(__mlx4_unregister_mac);
222222

223223
void mlx4_unregister_mac(struct mlx4_dev *dev, u8 port, u64 mac)
224224
{
225-
u64 out_param;
225+
u64 out_param = 0;
226226

227227
if (mlx4_is_mfunc(dev)) {
228228
set_param_l(&out_param, port);
@@ -361,7 +361,7 @@ static int __mlx4_register_vlan(struct mlx4_dev *dev, u8 port, u16 vlan,
361361

362362
int mlx4_register_vlan(struct mlx4_dev *dev, u8 port, u16 vlan, int *index)
363363
{
364-
u64 out_param;
364+
u64 out_param = 0;
365365
int err;
366366

367367
if (mlx4_is_mfunc(dev)) {
@@ -406,7 +406,7 @@ static void __mlx4_unregister_vlan(struct mlx4_dev *dev, u8 port, int index)
406406

407407
void mlx4_unregister_vlan(struct mlx4_dev *dev, u8 port, int index)
408408
{
409-
u64 in_param;
409+
u64 in_param = 0;
410410
int err;
411411

412412
if (mlx4_is_mfunc(dev)) {

drivers/net/ethernet/mellanox/mlx4/qp.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ int __mlx4_qp_reserve_range(struct mlx4_dev *dev, int cnt, int align,
222222

223223
int mlx4_qp_reserve_range(struct mlx4_dev *dev, int cnt, int align, int *base)
224224
{
225-
u64 in_param;
225+
u64 in_param = 0;
226226
u64 out_param;
227227
int err;
228228

@@ -255,7 +255,7 @@ void __mlx4_qp_release_range(struct mlx4_dev *dev, int base_qpn, int cnt)
255255

256256
void mlx4_qp_release_range(struct mlx4_dev *dev, int base_qpn, int cnt)
257257
{
258-
u64 in_param;
258+
u64 in_param = 0;
259259
int err;
260260

261261
if (mlx4_is_mfunc(dev)) {
@@ -319,7 +319,7 @@ int __mlx4_qp_alloc_icm(struct mlx4_dev *dev, int qpn)
319319

320320
static int mlx4_qp_alloc_icm(struct mlx4_dev *dev, int qpn)
321321
{
322-
u64 param;
322+
u64 param = 0;
323323

324324
if (mlx4_is_mfunc(dev)) {
325325
set_param_l(&param, qpn);
@@ -344,7 +344,7 @@ void __mlx4_qp_free_icm(struct mlx4_dev *dev, int qpn)
344344

345345
static void mlx4_qp_free_icm(struct mlx4_dev *dev, int qpn)
346346
{
347-
u64 in_param;
347+
u64 in_param = 0;
348348

349349
if (mlx4_is_mfunc(dev)) {
350350
set_param_l(&in_param, qpn);

0 commit comments

Comments
 (0)