Skip to content

Commit 4fc3acf

Browse files
committed
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull networking updates from David Miller: 1) Make syn floods consume significantly less resources by a) Not pre-COW'ing routing metrics for SYN/ACKs b) Mirroring the device queue mapping of the SYN for the SYN/ACK reply. Both from Eric Dumazet. 2) Fix calculation errors in Byte Queue Limiting, from Hiroaki SHIMODA. 3) Validate the length requested when building a paged SKB for a socket, so we don't overrun the page vector accidently. From Jason Wang. 4) When netlabel is disabled, we abort all IP option processing when we see a CIPSO option. This isn't the right thing to do, we should simply skip over it and continue processing the remaining options (if any). Fix from Paul Moore. 5) SRIOV fixes for the mellanox driver from Jack orgenstein and Marcel Apfelbaum. 6) 8139cp enables the receiver before the ring address is properly programmed, which potentially lets the device crap over random memory. Fix from Jason Wang. 7) e1000/e1000e fixes for i217 RST handling, and an improper buffer address reference in jumbo RX frame processing from Bruce Allan and Sebastian Andrzej Siewior, respectively. * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: fec_mpc52xx: fix timestamp filtering mcs7830: Implement link state detection e1000e: fix Rapid Start Technology support for i217 e1000: look into the page instead of skb->data for e1000_tbi_adjust_stats() r8169: call netif_napi_del at errpaths and at driver unload tcp: reflect SYN queue_mapping into SYNACK packets tcp: do not create inetpeer on SYNACK message 8139cp/8139too: terminate the eeprom access with the right opmode 8139cp: set ring address before enabling receiver cipso: handle CIPSO options correctly when NetLabel is disabled net: sock: validate data_len before allocating skb in sock_alloc_send_pskb() bql: Avoid possible inconsistent calculation. bql: Avoid unneeded limit decrement. bql: Fix POSDIFF() to integer overflow aware. net/mlx4_core: Fix obscure mlx4_cmd_box parameter in QUERY_DEV_CAP net/mlx4_core: Check port out-of-range before using in mlx4_slave_cap net/mlx4_core: Fixes for VF / Guest startup flow net/mlx4_en: Fix improper use of "port" parameter in mlx4_en_event net/mlx4_core: Fix number of EQs used in ICM initialisation net/mlx4_core: Fix the slave_id out-of-range test in mlx4_eq_int
2 parents 63004af + 9ca3cc6 commit 4fc3acf

File tree

21 files changed

+201
-84
lines changed

21 files changed

+201
-84
lines changed

drivers/net/ethernet/freescale/fec_mpc52xx.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,7 @@ static irqreturn_t mpc52xx_fec_rx_interrupt(int irq, void *dev_id)
437437
length = status & BCOM_FEC_RX_BD_LEN_MASK;
438438
skb_put(rskb, length - 4); /* length without CRC32 */
439439
rskb->protocol = eth_type_trans(rskb, dev);
440-
if (!skb_defer_rx_timestamp(skb))
440+
if (!skb_defer_rx_timestamp(rskb))
441441
netif_rx(rskb);
442442

443443
spin_lock(&priv->lock);

drivers/net/ethernet/intel/e1000/e1000_main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4080,7 +4080,7 @@ static bool e1000_clean_jumbo_rx_irq(struct e1000_adapter *adapter,
40804080
spin_lock_irqsave(&adapter->stats_lock,
40814081
irq_flags);
40824082
e1000_tbi_adjust_stats(hw, &adapter->stats,
4083-
length, skb->data);
4083+
length, mapped);
40844084
spin_unlock_irqrestore(&adapter->stats_lock,
40854085
irq_flags);
40864086
length--;

drivers/net/ethernet/intel/e1000e/ich8lan.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -165,14 +165,14 @@
165165
#define I217_EEE_100_SUPPORTED (1 << 1) /* 100BaseTx EEE supported */
166166

167167
/* Intel Rapid Start Technology Support */
168-
#define I217_PROXY_CTRL PHY_REG(BM_WUC_PAGE, 70)
168+
#define I217_PROXY_CTRL BM_PHY_REG(BM_WUC_PAGE, 70)
169169
#define I217_PROXY_CTRL_AUTO_DISABLE 0x0080
170170
#define I217_SxCTRL PHY_REG(BM_PORT_CTRL_PAGE, 28)
171-
#define I217_SxCTRL_MASK 0x1000
171+
#define I217_SxCTRL_ENABLE_LPI_RESET 0x1000
172172
#define I217_CGFREG PHY_REG(772, 29)
173-
#define I217_CGFREG_MASK 0x0002
173+
#define I217_CGFREG_ENABLE_MTA_RESET 0x0002
174174
#define I217_MEMPWR PHY_REG(772, 26)
175-
#define I217_MEMPWR_MASK 0x0010
175+
#define I217_MEMPWR_DISABLE_SMB_RELEASE 0x0010
176176

177177
/* Strapping Option Register - RO */
178178
#define E1000_STRAP 0x0000C
@@ -4089,12 +4089,12 @@ void e1000_suspend_workarounds_ich8lan(struct e1000_hw *hw)
40894089
* power good.
40904090
*/
40914091
e1e_rphy_locked(hw, I217_SxCTRL, &phy_reg);
4092-
phy_reg |= I217_SxCTRL_MASK;
4092+
phy_reg |= I217_SxCTRL_ENABLE_LPI_RESET;
40934093
e1e_wphy_locked(hw, I217_SxCTRL, phy_reg);
40944094

40954095
/* Disable the SMB release on LCD reset. */
40964096
e1e_rphy_locked(hw, I217_MEMPWR, &phy_reg);
4097-
phy_reg &= ~I217_MEMPWR;
4097+
phy_reg &= ~I217_MEMPWR_DISABLE_SMB_RELEASE;
40984098
e1e_wphy_locked(hw, I217_MEMPWR, phy_reg);
40994099
}
41004100

@@ -4103,7 +4103,7 @@ void e1000_suspend_workarounds_ich8lan(struct e1000_hw *hw)
41034103
* Support
41044104
*/
41054105
e1e_rphy_locked(hw, I217_CGFREG, &phy_reg);
4106-
phy_reg |= I217_CGFREG_MASK;
4106+
phy_reg |= I217_CGFREG_ENABLE_MTA_RESET;
41074107
e1e_wphy_locked(hw, I217_CGFREG, phy_reg);
41084108

41094109
release:
@@ -4176,7 +4176,7 @@ void e1000_resume_workarounds_pchlan(struct e1000_hw *hw)
41764176
ret_val = e1e_rphy_locked(hw, I217_MEMPWR, &phy_reg);
41774177
if (ret_val)
41784178
goto release;
4179-
phy_reg |= I217_MEMPWR_MASK;
4179+
phy_reg |= I217_MEMPWR_DISABLE_SMB_RELEASE;
41804180
e1e_wphy_locked(hw, I217_MEMPWR, phy_reg);
41814181

41824182
/* Disable Proxy */
@@ -4186,7 +4186,7 @@ void e1000_resume_workarounds_pchlan(struct e1000_hw *hw)
41864186
ret_val = e1e_rphy_locked(hw, I217_CGFREG, &phy_reg);
41874187
if (ret_val)
41884188
goto release;
4189-
phy_reg &= ~I217_CGFREG_MASK;
4189+
phy_reg &= ~I217_CGFREG_ENABLE_MTA_RESET;
41904190
e1e_wphy_locked(hw, I217_CGFREG, phy_reg);
41914191
release:
41924192
if (ret_val)

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,7 @@ static struct mlx4_cmd_info cmd_info[] = {
617617
.out_is_imm = false,
618618
.encode_slave_id = false,
619619
.verify = NULL,
620-
.wrapper = NULL
620+
.wrapper = mlx4_QUERY_FW_wrapper
621621
},
622622
{
623623
.opcode = MLX4_CMD_QUERY_HCA,
@@ -635,7 +635,7 @@ static struct mlx4_cmd_info cmd_info[] = {
635635
.out_is_imm = false,
636636
.encode_slave_id = false,
637637
.verify = NULL,
638-
.wrapper = NULL
638+
.wrapper = mlx4_QUERY_DEV_CAP_wrapper
639639
},
640640
{
641641
.opcode = MLX4_CMD_QUERY_FUNC_CAP,

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -136,13 +136,12 @@ static void mlx4_en_event(struct mlx4_dev *dev, void *endev_ptr,
136136
struct mlx4_en_dev *mdev = (struct mlx4_en_dev *) endev_ptr;
137137
struct mlx4_en_priv *priv;
138138

139-
if (!mdev->pndev[port])
140-
return;
141-
142-
priv = netdev_priv(mdev->pndev[port]);
143139
switch (event) {
144140
case MLX4_DEV_EVENT_PORT_UP:
145141
case MLX4_DEV_EVENT_PORT_DOWN:
142+
if (!mdev->pndev[port])
143+
return;
144+
priv = netdev_priv(mdev->pndev[port]);
146145
/* To prevent races, we poll the link state in a separate
147146
task rather than changing it here */
148147
priv->link_state = event;
@@ -154,7 +153,10 @@ static void mlx4_en_event(struct mlx4_dev *dev, void *endev_ptr,
154153
break;
155154

156155
default:
157-
mlx4_warn(mdev, "Unhandled event: %d\n", event);
156+
if (port < 1 || port > dev->caps.num_ports ||
157+
!mdev->pndev[port])
158+
return;
159+
mlx4_warn(mdev, "Unhandled event %d for port %d\n", event, port);
158160
}
159161
}
160162

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,7 @@ static int mlx4_eq_int(struct mlx4_dev *dev, struct mlx4_eq *eq)
426426

427427
mlx4_dbg(dev, "FLR event for slave: %d\n", flr_slave);
428428

429-
if (flr_slave > dev->num_slaves) {
429+
if (flr_slave >= dev->num_slaves) {
430430
mlx4_warn(dev,
431431
"Got FLR for unknown function: %d\n",
432432
flr_slave);

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

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
412412
outbox = mailbox->buf;
413413

414414
err = mlx4_cmd_box(dev, 0, mailbox->dma, 0, 0, MLX4_CMD_QUERY_DEV_CAP,
415-
MLX4_CMD_TIME_CLASS_A, !mlx4_is_slave(dev));
415+
MLX4_CMD_TIME_CLASS_A, MLX4_CMD_NATIVE);
416416
if (err)
417417
goto out;
418418

@@ -590,8 +590,7 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
590590

591591
for (i = 1; i <= dev_cap->num_ports; ++i) {
592592
err = mlx4_cmd_box(dev, 0, mailbox->dma, i, 0, MLX4_CMD_QUERY_PORT,
593-
MLX4_CMD_TIME_CLASS_B,
594-
!mlx4_is_slave(dev));
593+
MLX4_CMD_TIME_CLASS_B, MLX4_CMD_NATIVE);
595594
if (err)
596595
goto out;
597596

@@ -669,6 +668,28 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
669668
return err;
670669
}
671670

671+
int mlx4_QUERY_DEV_CAP_wrapper(struct mlx4_dev *dev, int slave,
672+
struct mlx4_vhcr *vhcr,
673+
struct mlx4_cmd_mailbox *inbox,
674+
struct mlx4_cmd_mailbox *outbox,
675+
struct mlx4_cmd_info *cmd)
676+
{
677+
int err = 0;
678+
u8 field;
679+
680+
err = mlx4_cmd_box(dev, 0, outbox->dma, 0, 0, MLX4_CMD_QUERY_DEV_CAP,
681+
MLX4_CMD_TIME_CLASS_A, MLX4_CMD_NATIVE);
682+
if (err)
683+
return err;
684+
685+
/* For guests, report Blueflame disabled */
686+
MLX4_GET(field, outbox->buf, QUERY_DEV_CAP_BF_OFFSET);
687+
field &= 0x7f;
688+
MLX4_PUT(outbox->buf, field, QUERY_DEV_CAP_BF_OFFSET);
689+
690+
return 0;
691+
}
692+
672693
int mlx4_QUERY_PORT_wrapper(struct mlx4_dev *dev, int slave,
673694
struct mlx4_vhcr *vhcr,
674695
struct mlx4_cmd_mailbox *inbox,
@@ -860,6 +881,9 @@ int mlx4_QUERY_FW(struct mlx4_dev *dev)
860881
((fw_ver & 0xffff0000ull) >> 16) |
861882
((fw_ver & 0x0000ffffull) << 16);
862883

884+
if (mlx4_is_slave(dev))
885+
goto out;
886+
863887
MLX4_GET(lg, outbox, QUERY_FW_PPF_ID);
864888
dev->caps.function = lg;
865889

@@ -927,6 +951,27 @@ int mlx4_QUERY_FW(struct mlx4_dev *dev)
927951
return err;
928952
}
929953

954+
int mlx4_QUERY_FW_wrapper(struct mlx4_dev *dev, int slave,
955+
struct mlx4_vhcr *vhcr,
956+
struct mlx4_cmd_mailbox *inbox,
957+
struct mlx4_cmd_mailbox *outbox,
958+
struct mlx4_cmd_info *cmd)
959+
{
960+
u8 *outbuf;
961+
int err;
962+
963+
outbuf = outbox->buf;
964+
err = mlx4_cmd_box(dev, 0, outbox->dma, 0, 0, MLX4_CMD_QUERY_FW,
965+
MLX4_CMD_TIME_CLASS_A, MLX4_CMD_NATIVE);
966+
if (err)
967+
return err;
968+
969+
/* for slaves, zero out everything except FW version */
970+
outbuf[0] = outbuf[1] = 0;
971+
memset(&outbuf[8], 0, QUERY_FW_OUT_SIZE - 8);
972+
return 0;
973+
}
974+
930975
static void get_board_id(void *vsd, char *board_id)
931976
{
932977
int i;

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

Lines changed: 13 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -142,12 +142,6 @@ struct mlx4_port_config {
142142
struct pci_dev *pdev;
143143
};
144144

145-
static inline int mlx4_master_get_num_eqs(struct mlx4_dev *dev)
146-
{
147-
return dev->caps.reserved_eqs +
148-
MLX4_MFUNC_EQ_NUM * (dev->num_slaves + 1);
149-
}
150-
151145
int mlx4_check_port_params(struct mlx4_dev *dev,
152146
enum mlx4_port_type *port_type)
153147
{
@@ -217,6 +211,7 @@ static int mlx4_dev_cap(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
217211
}
218212

219213
dev->caps.num_ports = dev_cap->num_ports;
214+
dev->phys_caps.num_phys_eqs = MLX4_MAX_EQ_NUM;
220215
for (i = 1; i <= dev->caps.num_ports; ++i) {
221216
dev->caps.vl_cap[i] = dev_cap->max_vl[i];
222217
dev->caps.ib_mtu_cap[i] = dev_cap->ib_mtu[i];
@@ -435,12 +430,17 @@ static int mlx4_slave_cap(struct mlx4_dev *dev)
435430
mlx4_log_num_mgm_entry_size = hca_param.log_mc_entry_sz;
436431

437432
memset(&dev_cap, 0, sizeof(dev_cap));
433+
dev->caps.max_qp_dest_rdma = 1 << hca_param.log_rd_per_qp;
438434
err = mlx4_dev_cap(dev, &dev_cap);
439435
if (err) {
440436
mlx4_err(dev, "QUERY_DEV_CAP command failed, aborting.\n");
441437
return err;
442438
}
443439

440+
err = mlx4_QUERY_FW(dev);
441+
if (err)
442+
mlx4_err(dev, "QUERY_FW command failed: could not get FW version.\n");
443+
444444
page_size = ~dev->caps.page_size_cap + 1;
445445
mlx4_warn(dev, "HCA minimum page size:%d\n", page_size);
446446
if (page_size > PAGE_SIZE) {
@@ -485,15 +485,15 @@ static int mlx4_slave_cap(struct mlx4_dev *dev)
485485
dev->caps.num_mgms = 0;
486486
dev->caps.num_amgms = 0;
487487

488-
for (i = 1; i <= dev->caps.num_ports; ++i)
489-
dev->caps.port_mask[i] = dev->caps.port_type[i];
490-
491488
if (dev->caps.num_ports > MLX4_MAX_PORTS) {
492489
mlx4_err(dev, "HCA has %d ports, but we only support %d, "
493490
"aborting.\n", dev->caps.num_ports, MLX4_MAX_PORTS);
494491
return -ENODEV;
495492
}
496493

494+
for (i = 1; i <= dev->caps.num_ports; ++i)
495+
dev->caps.port_mask[i] = dev->caps.port_type[i];
496+
497497
if (dev->caps.uar_page_size * (dev->caps.num_uars -
498498
dev->caps.reserved_uars) >
499499
pci_resource_len(dev->pdev, 2)) {
@@ -504,18 +504,6 @@ static int mlx4_slave_cap(struct mlx4_dev *dev)
504504
return -ENODEV;
505505
}
506506

507-
#if 0
508-
mlx4_warn(dev, "sqp_demux:%d\n", dev->caps.sqp_demux);
509-
mlx4_warn(dev, "num_uars:%d reserved_uars:%d uar region:0x%x bar2:0x%llx\n",
510-
dev->caps.num_uars, dev->caps.reserved_uars,
511-
dev->caps.uar_page_size * dev->caps.num_uars,
512-
pci_resource_len(dev->pdev, 2));
513-
mlx4_warn(dev, "num_eqs:%d reserved_eqs:%d\n", dev->caps.num_eqs,
514-
dev->caps.reserved_eqs);
515-
mlx4_warn(dev, "num_pds:%d reserved_pds:%d slave_pd_shift:%d pd_base:%d\n",
516-
dev->caps.num_pds, dev->caps.reserved_pds,
517-
dev->caps.slave_pd_shift, dev->caps.pd_base);
518-
#endif
519507
return 0;
520508
}
521509

@@ -810,9 +798,8 @@ static int mlx4_init_cmpt_table(struct mlx4_dev *dev, u64 cmpt_base,
810798
if (err)
811799
goto err_srq;
812800

813-
num_eqs = (mlx4_is_master(dev)) ?
814-
roundup_pow_of_two(mlx4_master_get_num_eqs(dev)) :
815-
dev->caps.num_eqs;
801+
num_eqs = (mlx4_is_master(dev)) ? dev->phys_caps.num_phys_eqs :
802+
dev->caps.num_eqs;
816803
err = mlx4_init_icm_table(dev, &priv->eq_table.cmpt_table,
817804
cmpt_base +
818805
((u64) (MLX4_CMPT_TYPE_EQ *
@@ -874,9 +861,8 @@ static int mlx4_init_icm(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap,
874861
}
875862

876863

877-
num_eqs = (mlx4_is_master(dev)) ?
878-
roundup_pow_of_two(mlx4_master_get_num_eqs(dev)) :
879-
dev->caps.num_eqs;
864+
num_eqs = (mlx4_is_master(dev)) ? dev->phys_caps.num_phys_eqs :
865+
dev->caps.num_eqs;
880866
err = mlx4_init_icm_table(dev, &priv->eq_table.table,
881867
init_hca->eqc_base, dev_cap->eqc_entry_sz,
882868
num_eqs, num_eqs, 0, 0);

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1039,6 +1039,11 @@ int mlx4_init_resource_tracker(struct mlx4_dev *dev);
10391039
void mlx4_free_resource_tracker(struct mlx4_dev *dev,
10401040
enum mlx4_res_tracker_free_type type);
10411041

1042+
int mlx4_QUERY_FW_wrapper(struct mlx4_dev *dev, int slave,
1043+
struct mlx4_vhcr *vhcr,
1044+
struct mlx4_cmd_mailbox *inbox,
1045+
struct mlx4_cmd_mailbox *outbox,
1046+
struct mlx4_cmd_info *cmd);
10421047
int mlx4_SET_PORT_wrapper(struct mlx4_dev *dev, int slave,
10431048
struct mlx4_vhcr *vhcr,
10441049
struct mlx4_cmd_mailbox *inbox,
@@ -1054,6 +1059,11 @@ int mlx4_CLOSE_PORT_wrapper(struct mlx4_dev *dev, int slave,
10541059
struct mlx4_cmd_mailbox *inbox,
10551060
struct mlx4_cmd_mailbox *outbox,
10561061
struct mlx4_cmd_info *cmd);
1062+
int mlx4_QUERY_DEV_CAP_wrapper(struct mlx4_dev *dev, int slave,
1063+
struct mlx4_vhcr *vhcr,
1064+
struct mlx4_cmd_mailbox *inbox,
1065+
struct mlx4_cmd_mailbox *outbox,
1066+
struct mlx4_cmd_info *cmd);
10571067
int mlx4_QUERY_PORT_wrapper(struct mlx4_dev *dev, int slave,
10581068
struct mlx4_vhcr *vhcr,
10591069
struct mlx4_cmd_mailbox *inbox,

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,9 @@ u64 mlx4_make_profile(struct mlx4_dev *dev,
126126
profile[MLX4_RES_AUXC].num = request->num_qp;
127127
profile[MLX4_RES_SRQ].num = request->num_srq;
128128
profile[MLX4_RES_CQ].num = request->num_cq;
129-
profile[MLX4_RES_EQ].num = min_t(unsigned, dev_cap->max_eqs, MAX_MSIX);
129+
profile[MLX4_RES_EQ].num = mlx4_is_mfunc(dev) ?
130+
dev->phys_caps.num_phys_eqs :
131+
min_t(unsigned, dev_cap->max_eqs, MAX_MSIX);
130132
profile[MLX4_RES_DMPT].num = request->num_mpt;
131133
profile[MLX4_RES_CMPT].num = MLX4_NUM_CMPTS;
132134
profile[MLX4_RES_MTT].num = request->num_mtt * (1 << log_mtts_per_seg);
@@ -215,9 +217,10 @@ u64 mlx4_make_profile(struct mlx4_dev *dev,
215217
init_hca->log_num_cqs = profile[i].log_num;
216218
break;
217219
case MLX4_RES_EQ:
218-
dev->caps.num_eqs = profile[i].num;
220+
dev->caps.num_eqs = roundup_pow_of_two(min_t(unsigned, dev_cap->max_eqs,
221+
MAX_MSIX));
219222
init_hca->eqc_base = profile[i].start;
220-
init_hca->log_num_eqs = profile[i].log_num;
223+
init_hca->log_num_eqs = ilog2(dev->caps.num_eqs);
221224
break;
222225
case MLX4_RES_DMPT:
223226
dev->caps.num_mpts = profile[i].num;

0 commit comments

Comments
 (0)