Skip to content

Commit 110bc76

Browse files
committed
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull networking fixes from David Miller: 1) Handle max TX power properly wrt VIFs and the MAC in iwlwifi, from Avri Altman. 2) Use the correct FW API for scan completions in iwlwifi, from Avraham Stern. 3) FW monitor in iwlwifi accidently uses unmapped memory, fix from Liad Kaufman. 4) rhashtable conversion of mac80211 station table was buggy, the virtual interface was not taken into account. Fix from Johannes Berg. 5) Fix deadlock in rtlwifi by not using a zero timeout for usb_control_msg(), from Larry Finger. 6) Update reordering state before calculating loss detection, from Yuchung Cheng. 7) Fix off by one in bluetooth firmward parsing, from Dan Carpenter. 8) Fix extended frame handling in xiling_can driver, from Jeppe Ledet-Pedersen. 9) Fix CODEL packet scheduler behavior in the presence of TSO packets, from Eric Dumazet. 10) Fix NAPI budget testing in fm10k driver, from Alexander Duyck. 11) macvlan needs to propagate promisc settings down the the lower device, from Vlad Yasevich. 12) igb driver can oops when changing number of rings, from Toshiaki Makita. 13) Source specific default routes not handled properly in ipv6, from Markus Stenberg. 14) Use after free in tc_ctl_tfilter(), from WANG Cong. 15) Use softirq spinlocking in netxen driver, from Tony Camuso. 16) Two ARM bpf JIT fixes from Nicolas Schichan. 17) Handle MSG_DONTWAIT properly in ring based AF_PACKET sends, from Mathias Kretschmer. 18) Fix x86 bpf JIT implementation of FROM_{BE16,LE16,LE32}, from Alexei Starovoitov. 19) ll_temac driver DMA maps TX packet header with incorrect length, fix from Michal Simek. 20) We removed pm_qos bits from netdevice.h, but some indirect references remained. Kill them. From David Ahern. * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (90 commits) net: Remove remaining remnants of pm_qos from netdevice.h e1000e: Add pm_qos header net: phy: micrel: Fix regression in kszphy_probe net: ll_temac: Fix DMA map size bug x86: bpf_jit: fix FROM_BE16 and FROM_LE16/32 instructions netns: return RTM_NEWNSID instead of RTM_GETNSID on a get Update be2net maintainers' email addresses net_sched: gred: use correct backlog value in WRED mode pppoe: drop pppoe device in pppoe_unbind_sock_work net: qca_spi: Fix possible race during probe net: mdio-gpio: Allow for unspecified bus id af_packet / TX_RING not fully non-blocking (w/ MSG_DONTWAIT). bnx2x: limit fw delay in kdump to 5s after boot ARM: net: delegate filter to kernel interpreter when imm_offset() return value can't fit into 12bits. ARM: net fix emit_udiv() for BPF_ALU | BPF_DIV | BPF_K intruction. mpls: Change reserved label names to be consistent with netbsd usbnet: avoid integer overflow in start_xmit netxen_nic: use spin_[un]lock_bh around tx_clean_lock (2) net: xgene_enet: Set hardware dependency net: amd-xgbe: Add hardware dependency ...
2 parents 6c9d370 + 01d460d commit 110bc76

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

102 files changed

+1838
-645
lines changed

MAINTAINERS

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4377,11 +4377,10 @@ F: fs/gfs2/
43774377
F: include/uapi/linux/gfs2_ondisk.h
43784378

43794379
GIGASET ISDN DRIVERS
4380-
M: Hansjoerg Lipp <[email protected]>
4381-
M: Tilman Schmidt <[email protected]>
4380+
M: Paul Bolle <[email protected]>
43824381
43834382
W: http://gigaset307x.sourceforge.net/
4384-
S: Maintained
4383+
S: Odd Fixes
43854384
F: Documentation/isdn/README.gigaset
43864385
F: drivers/isdn/gigaset/
43874386
F: include/uapi/linux/gigaset_dev.h
@@ -8827,10 +8826,11 @@ W: http://www.emulex.com
88278826
S: Supported
88288827
F: drivers/scsi/be2iscsi/
88298828

8830-
SERVER ENGINES 10Gbps NIC - BladeEngine 2 DRIVER
8831-
M: Sathya Perla <[email protected]>
8832-
M: Subbu Seetharaman <[email protected]>
8833-
M: Ajit Khaparde <[email protected]>
8829+
Emulex 10Gbps NIC BE2, BE3-R, Lancer, Skyhawk-R DRIVER
8830+
M: Sathya Perla <[email protected]>
8831+
M: Ajit Khaparde <[email protected]>
8832+
M: Padmanabh Ratnakar <[email protected]>
8833+
M: Sriharsha Basavapatna <[email protected]>
88348834
88358835
W: http://www.emulex.com
88368836
S: Supported

arch/arm/net/bpf_jit_32.c

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
#define SEEN_DATA (1 << (BPF_MEMWORDS + 3))
5555

5656
#define FLAG_NEED_X_RESET (1 << 0)
57+
#define FLAG_IMM_OVERFLOW (1 << 1)
5758

5859
struct jit_ctx {
5960
const struct bpf_prog *skf;
@@ -293,6 +294,15 @@ static u16 imm_offset(u32 k, struct jit_ctx *ctx)
293294
/* PC in ARM mode == address of the instruction + 8 */
294295
imm = offset - (8 + ctx->idx * 4);
295296

297+
if (imm & ~0xfff) {
298+
/*
299+
* literal pool is too far, signal it into flags. we
300+
* can only detect it on the second pass unfortunately.
301+
*/
302+
ctx->flags |= FLAG_IMM_OVERFLOW;
303+
return 0;
304+
}
305+
296306
return imm;
297307
}
298308

@@ -449,10 +459,21 @@ static inline void emit_udiv(u8 rd, u8 rm, u8 rn, struct jit_ctx *ctx)
449459
return;
450460
}
451461
#endif
452-
if (rm != ARM_R0)
453-
emit(ARM_MOV_R(ARM_R0, rm), ctx);
462+
463+
/*
464+
* For BPF_ALU | BPF_DIV | BPF_K instructions, rm is ARM_R4
465+
* (r_A) and rn is ARM_R0 (r_scratch) so load rn first into
466+
* ARM_R1 to avoid accidentally overwriting ARM_R0 with rm
467+
* before using it as a source for ARM_R1.
468+
*
469+
* For BPF_ALU | BPF_DIV | BPF_X rm is ARM_R4 (r_A) and rn is
470+
* ARM_R5 (r_X) so there is no particular register overlap
471+
* issues.
472+
*/
454473
if (rn != ARM_R1)
455474
emit(ARM_MOV_R(ARM_R1, rn), ctx);
475+
if (rm != ARM_R0)
476+
emit(ARM_MOV_R(ARM_R0, rm), ctx);
456477

457478
ctx->seen |= SEEN_CALL;
458479
emit_mov_i(ARM_R3, (u32)jit_udiv, ctx);
@@ -855,6 +876,14 @@ static int build_body(struct jit_ctx *ctx)
855876
default:
856877
return -1;
857878
}
879+
880+
if (ctx->flags & FLAG_IMM_OVERFLOW)
881+
/*
882+
* this instruction generated an overflow when
883+
* trying to access the literal pool, so
884+
* delegate this filter to the kernel interpreter.
885+
*/
886+
return -1;
858887
}
859888

860889
/* compute offsets only during the first pass */
@@ -917,7 +946,14 @@ void bpf_jit_compile(struct bpf_prog *fp)
917946
ctx.idx = 0;
918947

919948
build_prologue(&ctx);
920-
build_body(&ctx);
949+
if (build_body(&ctx) < 0) {
950+
#if __LINUX_ARM_ARCH__ < 7
951+
if (ctx.imm_count)
952+
kfree(ctx.imms);
953+
#endif
954+
bpf_jit_binary_free(header);
955+
goto out;
956+
}
921957
build_epilogue(&ctx);
922958

923959
flush_icache_range((u32)ctx.target, (u32)(ctx.target + ctx.idx));

arch/x86/net/bpf_jit_comp.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,13 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image,
559559
if (is_ereg(dst_reg))
560560
EMIT1(0x41);
561561
EMIT3(0xC1, add_1reg(0xC8, dst_reg), 8);
562+
563+
/* emit 'movzwl eax, ax' */
564+
if (is_ereg(dst_reg))
565+
EMIT3(0x45, 0x0F, 0xB7);
566+
else
567+
EMIT2(0x0F, 0xB7);
568+
EMIT1(add_2reg(0xC0, dst_reg, dst_reg));
562569
break;
563570
case 32:
564571
/* emit 'bswap eax' to swap lower 4 bytes */
@@ -577,6 +584,27 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image,
577584
break;
578585

579586
case BPF_ALU | BPF_END | BPF_FROM_LE:
587+
switch (imm32) {
588+
case 16:
589+
/* emit 'movzwl eax, ax' to zero extend 16-bit
590+
* into 64 bit
591+
*/
592+
if (is_ereg(dst_reg))
593+
EMIT3(0x45, 0x0F, 0xB7);
594+
else
595+
EMIT2(0x0F, 0xB7);
596+
EMIT1(add_2reg(0xC0, dst_reg, dst_reg));
597+
break;
598+
case 32:
599+
/* emit 'mov eax, eax' to clear upper 32-bits */
600+
if (is_ereg(dst_reg))
601+
EMIT1(0x45);
602+
EMIT2(0x89, add_2reg(0xC0, dst_reg, dst_reg));
603+
break;
604+
case 64:
605+
/* nop */
606+
break;
607+
}
580608
break;
581609

582610
/* ST: *(u8*)(dst_reg + off) = imm */

drivers/bluetooth/bt3c_cs.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,6 @@ static void bt3c_receive(struct bt3c_info *info)
227227
iobase = info->p_dev->resource[0]->start;
228228

229229
avail = bt3c_read(iobase, 0x7006);
230-
//printk("bt3c_cs: receiving %d bytes\n", avail);
231230

232231
bt3c_address(iobase, 0x7480);
233232
while (size < avail) {
@@ -250,7 +249,6 @@ static void bt3c_receive(struct bt3c_info *info)
250249

251250
bt_cb(info->rx_skb)->pkt_type = inb(iobase + DATA_L);
252251
inb(iobase + DATA_H);
253-
//printk("bt3c: PACKET_TYPE=%02x\n", bt_cb(info->rx_skb)->pkt_type);
254252

255253
switch (bt_cb(info->rx_skb)->pkt_type) {
256254

@@ -364,7 +362,6 @@ static irqreturn_t bt3c_interrupt(int irq, void *dev_inst)
364362
if (stat & 0x0001)
365363
bt3c_receive(info);
366364
if (stat & 0x0002) {
367-
//BT_ERR("Ack (stat=0x%04x)", stat);
368365
clear_bit(XMIT_SENDING, &(info->tx_state));
369366
bt3c_write_wakeup(info);
370367
}

drivers/bluetooth/btbcm.c

Lines changed: 79 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,78 @@ int btbcm_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr)
9595
}
9696
EXPORT_SYMBOL_GPL(btbcm_set_bdaddr);
9797

98+
int btbcm_patchram(struct hci_dev *hdev, const char *firmware)
99+
{
100+
const struct hci_command_hdr *cmd;
101+
const struct firmware *fw;
102+
const u8 *fw_ptr;
103+
size_t fw_size;
104+
struct sk_buff *skb;
105+
u16 opcode;
106+
int err;
107+
108+
err = request_firmware(&fw, firmware, &hdev->dev);
109+
if (err < 0) {
110+
BT_INFO("%s: BCM: Patch %s not found", hdev->name, firmware);
111+
return err;
112+
}
113+
114+
/* Start Download */
115+
skb = __hci_cmd_sync(hdev, 0xfc2e, 0, NULL, HCI_INIT_TIMEOUT);
116+
if (IS_ERR(skb)) {
117+
err = PTR_ERR(skb);
118+
BT_ERR("%s: BCM: Download Minidrv command failed (%d)",
119+
hdev->name, err);
120+
goto done;
121+
}
122+
kfree_skb(skb);
123+
124+
/* 50 msec delay after Download Minidrv completes */
125+
msleep(50);
126+
127+
fw_ptr = fw->data;
128+
fw_size = fw->size;
129+
130+
while (fw_size >= sizeof(*cmd)) {
131+
const u8 *cmd_param;
132+
133+
cmd = (struct hci_command_hdr *)fw_ptr;
134+
fw_ptr += sizeof(*cmd);
135+
fw_size -= sizeof(*cmd);
136+
137+
if (fw_size < cmd->plen) {
138+
BT_ERR("%s: BCM: Patch %s is corrupted", hdev->name,
139+
firmware);
140+
err = -EINVAL;
141+
goto done;
142+
}
143+
144+
cmd_param = fw_ptr;
145+
fw_ptr += cmd->plen;
146+
fw_size -= cmd->plen;
147+
148+
opcode = le16_to_cpu(cmd->opcode);
149+
150+
skb = __hci_cmd_sync(hdev, opcode, cmd->plen, cmd_param,
151+
HCI_INIT_TIMEOUT);
152+
if (IS_ERR(skb)) {
153+
err = PTR_ERR(skb);
154+
BT_ERR("%s: BCM: Patch command %04x failed (%d)",
155+
hdev->name, opcode, err);
156+
goto done;
157+
}
158+
kfree_skb(skb);
159+
}
160+
161+
/* 250 msec delay after Launch Ram completes */
162+
msleep(250);
163+
164+
done:
165+
release_firmware(fw);
166+
return err;
167+
}
168+
EXPORT_SYMBOL(btbcm_patchram);
169+
98170
static int btbcm_reset(struct hci_dev *hdev)
99171
{
100172
struct sk_buff *skb;
@@ -198,12 +270,8 @@ static const struct {
198270

199271
int btbcm_setup_patchram(struct hci_dev *hdev)
200272
{
201-
const struct hci_command_hdr *cmd;
202-
const struct firmware *fw;
203-
const u8 *fw_ptr;
204-
size_t fw_size;
205273
char fw_name[64];
206-
u16 opcode, subver, rev, pid, vid;
274+
u16 subver, rev, pid, vid;
207275
const char *hw_name = NULL;
208276
struct sk_buff *skb;
209277
struct hci_rp_read_local_version *ver;
@@ -273,74 +341,19 @@ int btbcm_setup_patchram(struct hci_dev *hdev)
273341
hw_name ? : "BCM", (subver & 0x7000) >> 13,
274342
(subver & 0x1f00) >> 8, (subver & 0x00ff), rev & 0x0fff);
275343

276-
err = request_firmware(&fw, fw_name, &hdev->dev);
277-
if (err < 0) {
278-
BT_INFO("%s: BCM: patch %s not found", hdev->name, fw_name);
344+
err = btbcm_patchram(hdev, fw_name);
345+
if (err == -ENOENT)
279346
return 0;
280-
}
281-
282-
/* Start Download */
283-
skb = __hci_cmd_sync(hdev, 0xfc2e, 0, NULL, HCI_INIT_TIMEOUT);
284-
if (IS_ERR(skb)) {
285-
err = PTR_ERR(skb);
286-
BT_ERR("%s: BCM: Download Minidrv command failed (%d)",
287-
hdev->name, err);
288-
goto reset;
289-
}
290-
kfree_skb(skb);
291-
292-
/* 50 msec delay after Download Minidrv completes */
293-
msleep(50);
294-
295-
fw_ptr = fw->data;
296-
fw_size = fw->size;
297-
298-
while (fw_size >= sizeof(*cmd)) {
299-
const u8 *cmd_param;
300-
301-
cmd = (struct hci_command_hdr *)fw_ptr;
302-
fw_ptr += sizeof(*cmd);
303-
fw_size -= sizeof(*cmd);
304-
305-
if (fw_size < cmd->plen) {
306-
BT_ERR("%s: BCM: patch %s is corrupted", hdev->name,
307-
fw_name);
308-
err = -EINVAL;
309-
goto reset;
310-
}
311347

312-
cmd_param = fw_ptr;
313-
fw_ptr += cmd->plen;
314-
fw_size -= cmd->plen;
315-
316-
opcode = le16_to_cpu(cmd->opcode);
317-
318-
skb = __hci_cmd_sync(hdev, opcode, cmd->plen, cmd_param,
319-
HCI_INIT_TIMEOUT);
320-
if (IS_ERR(skb)) {
321-
err = PTR_ERR(skb);
322-
BT_ERR("%s: BCM: patch command %04x failed (%d)",
323-
hdev->name, opcode, err);
324-
goto reset;
325-
}
326-
kfree_skb(skb);
327-
}
328-
329-
/* 250 msec delay after Launch Ram completes */
330-
msleep(250);
331-
332-
reset:
333348
/* Reset */
334349
err = btbcm_reset(hdev);
335350
if (err)
336-
goto done;
351+
return err;
337352

338353
/* Read Local Version Info */
339354
skb = btbcm_read_local_version(hdev);
340-
if (IS_ERR(skb)) {
341-
err = PTR_ERR(skb);
342-
goto done;
343-
}
355+
if (IS_ERR(skb))
356+
return PTR_ERR(skb);
344357

345358
ver = (struct hci_rp_read_local_version *)skb->data;
346359
rev = le16_to_cpu(ver->hci_rev);
@@ -355,10 +368,7 @@ int btbcm_setup_patchram(struct hci_dev *hdev)
355368

356369
set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
357370

358-
done:
359-
release_firmware(fw);
360-
361-
return err;
371+
return 0;
362372
}
363373
EXPORT_SYMBOL_GPL(btbcm_setup_patchram);
364374

drivers/bluetooth/btbcm.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
int btbcm_check_bdaddr(struct hci_dev *hdev);
2727
int btbcm_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr);
28+
int btbcm_patchram(struct hci_dev *hdev, const char *firmware);
2829

2930
int btbcm_setup_patchram(struct hci_dev *hdev);
3031
int btbcm_setup_apple(struct hci_dev *hdev);
@@ -41,6 +42,11 @@ static inline int btbcm_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr)
4142
return -EOPNOTSUPP;
4243
}
4344

45+
static inline int btbcm_patchram(struct hci_dev *hdev, const char *firmware)
46+
{
47+
return -EOPNOTSUPP;
48+
}
49+
4450
static inline int btbcm_setup_patchram(struct hci_dev *hdev)
4551
{
4652
return 0;

0 commit comments

Comments
 (0)