mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 21:38:32 +08:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull networking update from David Miller: 1) Pairing and deadlock fixes in bluetooth from Johan Hedberg. 2) Add device IDs for AR3011 and AR3012 bluetooth chips. From Giancarlo Formicuccia and Marek Vasut. 3) Fix wireless regulatory deadlock, from Eliad Peller. 4) Fix full TX ring panic in bnx2x driver, from Eric Dumazet. 5) Revert the two commits that added skb_orphan_try(), it causes erratic bonding behavior with UDP clients and the gains it used to give are mostly no longer happening due to how BQL works. From Eric Dumazet. 6) It took two tries, but Thomas Graf fixed a problem wherein we registered ipv6 routing procfs files before their backend data were initialized properly. 7) Fix max GSO size setting in be2net, from Sarveshwar Bandi. 8) PHY device id mask is wrong for KSZ9021 and KS8001 chips, fix from Jason Wang. 9) Fix use of stale SKB data pointer after skb_linearize() call in batman-adv, from Antonio Quartulli. 10) Fix memory leak in IXGBE due to missing __GFP_COMP, from Alexander Duyck. 11) Fix probing of Gobi devices in qmi_wwan usbnet driver, from Bjørn Mork. 12) Fix suspend/resume and open failure handling in usbnet from Ming Lei. 13) Attempt to fix device r8169 hangs for certain chips, from Francois Romieu. 14) Fix advancement of RX dirty pointer in some situations in sh_eth driver, from Yoshihiro Shimoda. 15) Attempt to fix restart of IPV6 routing table dumps when there is an intervening table update. From Eric Dumazet. 16) Respect security_inet_conn_request() return value in ipv6 TCP. From Neal Cardwell. 17) Add another iPAD device ID to ipheth driver, from Davide Gerhard. 18) Fix access to freed SKB in l2tp_eth_dev_xmit(), and fix l2tp lockdep splats, from Eric Dumazet. 19) Make sure all bridge devices, regardless of whether they were created via netlink or ioctls, have their rtnetlink ops hooked up. From Thomas Graf and Stephen Hemminger. * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (81 commits) 9p: fix min_t() casting in p9pdu_vwritef() can: flexcan: use be32_to_cpup to handle the value of dt entry xen/netfront: teardown the device before unregistering it. bridge: Assign rtnl_link_ops to bridge devices created via ioctl (v2) vhost: use USER_DS in vhost_worker thread ixgbe: Do not pad FCoE frames as this can cause issues with FCoE DDP net: l2tp_eth: use LLTX to avoid LOCKDEP splats mac802154: add missed braces net: l2tp_eth: fix l2tp_eth_dev_xmit race net/mlx4_en: Release QP range in free_resources net/mlx4: Use single completion vector after NOP failure net/mlx4_en: Set correct port parameters during device initialization ipheth: add support for iPad caif-hsi: Add missing return in error path caif-hsi: Bugfix - Piggyback'ed embedded CAIF frame lost caif: Clear shutdown mask to zero at reconnect. tcp: heed result of security_inet_conn_request() in tcp_v6_conn_request() ipv6: fib: fix fib dump restart batman-adv: fix race condition in TT full-table replacement batman-adv: only drop packets of known wifi clients ...
This commit is contained in:
commit
f3747e2f2c
@ -63,6 +63,7 @@ static struct usb_device_id ath3k_table[] = {
|
||||
|
||||
/* Atheros AR3011 with sflash firmware*/
|
||||
{ USB_DEVICE(0x0CF3, 0x3002) },
|
||||
{ USB_DEVICE(0x0CF3, 0xE019) },
|
||||
{ USB_DEVICE(0x13d3, 0x3304) },
|
||||
{ USB_DEVICE(0x0930, 0x0215) },
|
||||
{ USB_DEVICE(0x0489, 0xE03D) },
|
||||
@ -77,6 +78,7 @@ static struct usb_device_id ath3k_table[] = {
|
||||
{ USB_DEVICE(0x04CA, 0x3005) },
|
||||
{ USB_DEVICE(0x13d3, 0x3362) },
|
||||
{ USB_DEVICE(0x0CF3, 0xE004) },
|
||||
{ USB_DEVICE(0x0930, 0x0219) },
|
||||
|
||||
/* Atheros AR5BBU12 with sflash firmware */
|
||||
{ USB_DEVICE(0x0489, 0xE02C) },
|
||||
@ -101,6 +103,7 @@ static struct usb_device_id ath3k_blist_tbl[] = {
|
||||
{ USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
|
||||
|
||||
/* Atheros AR5BBU22 with sflash firmware */
|
||||
{ USB_DEVICE(0x0489, 0xE03C), .driver_info = BTUSB_ATH3012 },
|
||||
|
@ -136,7 +136,7 @@ int btmrvl_remove_card(struct btmrvl_private *priv);
|
||||
|
||||
void btmrvl_interrupt(struct btmrvl_private *priv);
|
||||
|
||||
void btmrvl_check_evtpkt(struct btmrvl_private *priv, struct sk_buff *skb);
|
||||
bool btmrvl_check_evtpkt(struct btmrvl_private *priv, struct sk_buff *skb);
|
||||
int btmrvl_process_event(struct btmrvl_private *priv, struct sk_buff *skb);
|
||||
|
||||
int btmrvl_send_module_cfg_cmd(struct btmrvl_private *priv, int subcmd);
|
||||
|
@ -44,23 +44,33 @@ void btmrvl_interrupt(struct btmrvl_private *priv)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(btmrvl_interrupt);
|
||||
|
||||
void btmrvl_check_evtpkt(struct btmrvl_private *priv, struct sk_buff *skb)
|
||||
bool btmrvl_check_evtpkt(struct btmrvl_private *priv, struct sk_buff *skb)
|
||||
{
|
||||
struct hci_event_hdr *hdr = (void *) skb->data;
|
||||
struct hci_ev_cmd_complete *ec;
|
||||
u16 opcode, ocf;
|
||||
u16 opcode, ocf, ogf;
|
||||
|
||||
if (hdr->evt == HCI_EV_CMD_COMPLETE) {
|
||||
ec = (void *) (skb->data + HCI_EVENT_HDR_SIZE);
|
||||
opcode = __le16_to_cpu(ec->opcode);
|
||||
ocf = hci_opcode_ocf(opcode);
|
||||
ogf = hci_opcode_ogf(opcode);
|
||||
|
||||
if (ocf == BT_CMD_MODULE_CFG_REQ &&
|
||||
priv->btmrvl_dev.sendcmdflag) {
|
||||
priv->btmrvl_dev.sendcmdflag = false;
|
||||
priv->adapter->cmd_complete = true;
|
||||
wake_up_interruptible(&priv->adapter->cmd_wait_q);
|
||||
}
|
||||
|
||||
if (ogf == OGF) {
|
||||
BT_DBG("vendor event skipped: ogf 0x%4.4x", ogf);
|
||||
kfree_skb(skb);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(btmrvl_check_evtpkt);
|
||||
|
||||
|
@ -562,10 +562,12 @@ static int btmrvl_sdio_card_to_host(struct btmrvl_private *priv)
|
||||
skb_put(skb, buf_len);
|
||||
skb_pull(skb, SDIO_HEADER_LEN);
|
||||
|
||||
if (type == HCI_EVENT_PKT)
|
||||
btmrvl_check_evtpkt(priv, skb);
|
||||
if (type == HCI_EVENT_PKT) {
|
||||
if (btmrvl_check_evtpkt(priv, skb))
|
||||
hci_recv_frame(skb);
|
||||
} else
|
||||
hci_recv_frame(skb);
|
||||
|
||||
hci_recv_frame(skb);
|
||||
hdev->stat.byte_rx += buf_len;
|
||||
break;
|
||||
|
||||
|
@ -125,6 +125,7 @@ static struct usb_device_id blacklist_table[] = {
|
||||
|
||||
/* Atheros 3011 with sflash firmware */
|
||||
{ USB_DEVICE(0x0cf3, 0x3002), .driver_info = BTUSB_IGNORE },
|
||||
{ USB_DEVICE(0x0cf3, 0xe019), .driver_info = BTUSB_IGNORE },
|
||||
{ USB_DEVICE(0x13d3, 0x3304), .driver_info = BTUSB_IGNORE },
|
||||
{ USB_DEVICE(0x0930, 0x0215), .driver_info = BTUSB_IGNORE },
|
||||
{ USB_DEVICE(0x0489, 0xe03d), .driver_info = BTUSB_IGNORE },
|
||||
@ -139,6 +140,7 @@ static struct usb_device_id blacklist_table[] = {
|
||||
{ USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
|
||||
|
||||
/* Atheros AR5BBU12 with sflash firmware */
|
||||
{ USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE },
|
||||
|
@ -150,14 +150,25 @@ static void bond_info_show_master(struct seq_file *seq)
|
||||
}
|
||||
}
|
||||
|
||||
static const char *bond_slave_link_status(s8 link)
|
||||
{
|
||||
static const char * const status[] = {
|
||||
[BOND_LINK_UP] = "up",
|
||||
[BOND_LINK_FAIL] = "going down",
|
||||
[BOND_LINK_DOWN] = "down",
|
||||
[BOND_LINK_BACK] = "going back",
|
||||
};
|
||||
|
||||
return status[link];
|
||||
}
|
||||
|
||||
static void bond_info_show_slave(struct seq_file *seq,
|
||||
const struct slave *slave)
|
||||
{
|
||||
struct bonding *bond = seq->private;
|
||||
|
||||
seq_printf(seq, "\nSlave Interface: %s\n", slave->dev->name);
|
||||
seq_printf(seq, "MII Status: %s\n",
|
||||
(slave->link == BOND_LINK_UP) ? "up" : "down");
|
||||
seq_printf(seq, "MII Status: %s\n", bond_slave_link_status(slave->link));
|
||||
if (slave->speed == SPEED_UNKNOWN)
|
||||
seq_printf(seq, "Speed: %s\n", "Unknown");
|
||||
else
|
||||
|
@ -693,8 +693,6 @@ static void cfhsi_rx_done(struct cfhsi *cfhsi)
|
||||
*/
|
||||
memcpy(rx_buf, (u8 *)piggy_desc,
|
||||
CFHSI_DESC_SHORT_SZ);
|
||||
/* Mark no embedded frame here */
|
||||
piggy_desc->offset = 0;
|
||||
if (desc_pld_len == -EPROTO)
|
||||
goto out_of_sync;
|
||||
}
|
||||
@ -737,6 +735,8 @@ static void cfhsi_rx_done(struct cfhsi *cfhsi)
|
||||
/* Extract any payload in piggyback descriptor. */
|
||||
if (cfhsi_rx_desc(piggy_desc, cfhsi) < 0)
|
||||
goto out_of_sync;
|
||||
/* Mark no embedded frame after extracting it */
|
||||
piggy_desc->offset = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1178,6 +1178,7 @@ int cfhsi_probe(struct platform_device *pdev)
|
||||
dev_err(&ndev->dev, "%s: Registration error: %d.\n",
|
||||
__func__, res);
|
||||
free_netdev(ndev);
|
||||
return -ENODEV;
|
||||
}
|
||||
/* Add CAIF HSI device to list. */
|
||||
spin_lock(&cfhsi_list_lock);
|
||||
|
@ -590,8 +590,8 @@ static void c_can_chip_config(struct net_device *dev)
|
||||
priv->write_reg(priv, &priv->regs->control,
|
||||
CONTROL_ENABLE_AR);
|
||||
|
||||
if (priv->can.ctrlmode & (CAN_CTRLMODE_LISTENONLY &
|
||||
CAN_CTRLMODE_LOOPBACK)) {
|
||||
if ((priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) &&
|
||||
(priv->can.ctrlmode & CAN_CTRLMODE_LOOPBACK)) {
|
||||
/* loopback + silent mode : useful for hot self-test */
|
||||
priv->write_reg(priv, &priv->regs->control, CONTROL_EIE |
|
||||
CONTROL_SIE | CONTROL_IE | CONTROL_TEST);
|
||||
|
@ -939,12 +939,12 @@ static int __devinit flexcan_probe(struct platform_device *pdev)
|
||||
return PTR_ERR(pinctrl);
|
||||
|
||||
if (pdev->dev.of_node) {
|
||||
const u32 *clock_freq_p;
|
||||
const __be32 *clock_freq_p;
|
||||
|
||||
clock_freq_p = of_get_property(pdev->dev.of_node,
|
||||
"clock-frequency", NULL);
|
||||
if (clock_freq_p)
|
||||
clock_freq = *clock_freq_p;
|
||||
clock_freq = be32_to_cpup(clock_freq_p);
|
||||
}
|
||||
|
||||
if (!clock_freq) {
|
||||
|
@ -190,7 +190,7 @@ int bnx2x_tx_int(struct bnx2x *bp, struct bnx2x_fp_txdata *txdata)
|
||||
|
||||
if ((netif_tx_queue_stopped(txq)) &&
|
||||
(bp->state == BNX2X_STATE_OPEN) &&
|
||||
(bnx2x_tx_avail(bp, txdata) >= MAX_SKB_FRAGS + 3))
|
||||
(bnx2x_tx_avail(bp, txdata) >= MAX_SKB_FRAGS + 4))
|
||||
netif_tx_wake_queue(txq);
|
||||
|
||||
__netif_tx_unlock(txq);
|
||||
@ -2516,8 +2516,6 @@ int bnx2x_poll(struct napi_struct *napi, int budget)
|
||||
/* we split the first BD into headers and data BDs
|
||||
* to ease the pain of our fellow microcode engineers
|
||||
* we use one mapping for both BDs
|
||||
* So far this has only been observed to happen
|
||||
* in Other Operating Systems(TM)
|
||||
*/
|
||||
static noinline u16 bnx2x_tx_split(struct bnx2x *bp,
|
||||
struct bnx2x_fp_txdata *txdata,
|
||||
@ -3171,7 +3169,7 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
|
||||
txdata->tx_bd_prod += nbd;
|
||||
|
||||
if (unlikely(bnx2x_tx_avail(bp, txdata) < MAX_SKB_FRAGS + 3)) {
|
||||
if (unlikely(bnx2x_tx_avail(bp, txdata) < MAX_SKB_FRAGS + 4)) {
|
||||
netif_tx_stop_queue(txq);
|
||||
|
||||
/* paired memory barrier is in bnx2x_tx_int(), we have to keep
|
||||
@ -3180,7 +3178,7 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
smp_mb();
|
||||
|
||||
fp->eth_q_stats.driver_xoff++;
|
||||
if (bnx2x_tx_avail(bp, txdata) >= MAX_SKB_FRAGS + 3)
|
||||
if (bnx2x_tx_avail(bp, txdata) >= MAX_SKB_FRAGS + 4)
|
||||
netif_tx_wake_queue(txq);
|
||||
}
|
||||
txdata->tx_pkt++;
|
||||
|
@ -40,6 +40,7 @@
|
||||
#define I2C_BSC0 0
|
||||
#define I2C_BSC1 1
|
||||
#define I2C_WA_RETRY_CNT 3
|
||||
#define I2C_WA_PWR_ITER (I2C_WA_RETRY_CNT - 1)
|
||||
#define MCPR_IMC_COMMAND_READ_OP 1
|
||||
#define MCPR_IMC_COMMAND_WRITE_OP 2
|
||||
|
||||
@ -7659,6 +7660,28 @@ static int bnx2x_8726_read_sfp_module_eeprom(struct bnx2x_phy *phy,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static void bnx2x_warpcore_power_module(struct link_params *params,
|
||||
struct bnx2x_phy *phy,
|
||||
u8 power)
|
||||
{
|
||||
u32 pin_cfg;
|
||||
struct bnx2x *bp = params->bp;
|
||||
|
||||
pin_cfg = (REG_RD(bp, params->shmem_base +
|
||||
offsetof(struct shmem_region,
|
||||
dev_info.port_hw_config[params->port].e3_sfp_ctrl)) &
|
||||
PORT_HW_CFG_E3_PWR_DIS_MASK) >>
|
||||
PORT_HW_CFG_E3_PWR_DIS_SHIFT;
|
||||
|
||||
if (pin_cfg == PIN_CFG_NA)
|
||||
return;
|
||||
DP(NETIF_MSG_LINK, "Setting SFP+ module power to %d using pin cfg %d\n",
|
||||
power, pin_cfg);
|
||||
/* Low ==> corresponding SFP+ module is powered
|
||||
* high ==> the SFP+ module is powered down
|
||||
*/
|
||||
bnx2x_set_cfg_pin(bp, pin_cfg, power ^ 1);
|
||||
}
|
||||
static int bnx2x_warpcore_read_sfp_module_eeprom(struct bnx2x_phy *phy,
|
||||
struct link_params *params,
|
||||
u16 addr, u8 byte_cnt,
|
||||
@ -7678,6 +7701,12 @@ static int bnx2x_warpcore_read_sfp_module_eeprom(struct bnx2x_phy *phy,
|
||||
/* 4 byte aligned address */
|
||||
addr32 = addr & (~0x3);
|
||||
do {
|
||||
if (cnt == I2C_WA_PWR_ITER) {
|
||||
bnx2x_warpcore_power_module(params, phy, 0);
|
||||
/* Note that 100us are not enough here */
|
||||
usleep_range(1000,1000);
|
||||
bnx2x_warpcore_power_module(params, phy, 1);
|
||||
}
|
||||
rc = bnx2x_bsc_read(params, phy, 0xa0, addr32, 0, byte_cnt,
|
||||
data_array);
|
||||
} while ((rc != 0) && (++cnt < I2C_WA_RETRY_CNT));
|
||||
@ -8200,29 +8229,6 @@ static void bnx2x_set_sfp_module_fault_led(struct link_params *params,
|
||||
bnx2x_set_e1e2_module_fault_led(params, gpio_mode);
|
||||
}
|
||||
|
||||
static void bnx2x_warpcore_power_module(struct link_params *params,
|
||||
struct bnx2x_phy *phy,
|
||||
u8 power)
|
||||
{
|
||||
u32 pin_cfg;
|
||||
struct bnx2x *bp = params->bp;
|
||||
|
||||
pin_cfg = (REG_RD(bp, params->shmem_base +
|
||||
offsetof(struct shmem_region,
|
||||
dev_info.port_hw_config[params->port].e3_sfp_ctrl)) &
|
||||
PORT_HW_CFG_E3_PWR_DIS_MASK) >>
|
||||
PORT_HW_CFG_E3_PWR_DIS_SHIFT;
|
||||
|
||||
if (pin_cfg == PIN_CFG_NA)
|
||||
return;
|
||||
DP(NETIF_MSG_LINK, "Setting SFP+ module power to %d using pin cfg %d\n",
|
||||
power, pin_cfg);
|
||||
/* Low ==> corresponding SFP+ module is powered
|
||||
* high ==> the SFP+ module is powered down
|
||||
*/
|
||||
bnx2x_set_cfg_pin(bp, pin_cfg, power ^ 1);
|
||||
}
|
||||
|
||||
static void bnx2x_warpcore_hw_reset(struct bnx2x_phy *phy,
|
||||
struct link_params *params)
|
||||
{
|
||||
@ -9748,7 +9754,7 @@ static int bnx2x_848x3_config_init(struct bnx2x_phy *phy,
|
||||
|
||||
msleep(1);
|
||||
|
||||
if (!(CHIP_IS_E1(bp)))
|
||||
if (!(CHIP_IS_E1x(bp)))
|
||||
port = BP_PATH(bp);
|
||||
else
|
||||
port = params->port;
|
||||
|
@ -122,15 +122,15 @@ static int be_mcc_compl_process(struct be_adapter *adapter,
|
||||
goto done;
|
||||
|
||||
if (compl_status == MCC_STATUS_UNAUTHORIZED_REQUEST) {
|
||||
dev_warn(&adapter->pdev->dev, "This domain(VM) is not "
|
||||
"permitted to execute this cmd (opcode %d)\n",
|
||||
opcode);
|
||||
dev_warn(&adapter->pdev->dev,
|
||||
"opcode %d-%d is not permitted\n",
|
||||
opcode, subsystem);
|
||||
} else {
|
||||
extd_status = (compl->status >> CQE_STATUS_EXTD_SHIFT) &
|
||||
CQE_STATUS_EXTD_MASK;
|
||||
dev_err(&adapter->pdev->dev, "Cmd (opcode %d) failed:"
|
||||
"status %d, extd-status %d\n",
|
||||
opcode, compl_status, extd_status);
|
||||
dev_err(&adapter->pdev->dev,
|
||||
"opcode %d-%d failed:status %d-%d\n",
|
||||
opcode, subsystem, compl_status, extd_status);
|
||||
}
|
||||
}
|
||||
done:
|
||||
|
@ -1566,7 +1566,7 @@ struct be_hw_stats_v1 {
|
||||
u32 rsvd0[BE_TXP_SW_SZ];
|
||||
struct be_erx_stats_v1 erx;
|
||||
struct be_pmem_stats pmem;
|
||||
u32 rsvd1[3];
|
||||
u32 rsvd1[18];
|
||||
};
|
||||
|
||||
struct be_cmd_req_get_stats_v1 {
|
||||
|
@ -3237,7 +3237,7 @@ static void be_netdev_init(struct net_device *netdev)
|
||||
|
||||
netdev->flags |= IFF_MULTICAST;
|
||||
|
||||
netif_set_gso_max_size(netdev, 65535);
|
||||
netif_set_gso_max_size(netdev, 65535 - ETH_HLEN);
|
||||
|
||||
netdev->netdev_ops = &be_netdev_ops;
|
||||
|
||||
|
@ -122,8 +122,10 @@ config IGB_DCA
|
||||
|
||||
config IGB_PTP
|
||||
bool "PTP Hardware Clock (PHC)"
|
||||
default y
|
||||
depends on IGB && PTP_1588_CLOCK
|
||||
default n
|
||||
depends on IGB && EXPERIMENTAL
|
||||
select PPS
|
||||
select PTP_1588_CLOCK
|
||||
---help---
|
||||
Say Y here if you want to use PTP Hardware Clock (PHC) in the
|
||||
driver. Only the basic clock operations have been implemented.
|
||||
@ -223,7 +225,9 @@ config IXGBE_DCB
|
||||
config IXGBE_PTP
|
||||
bool "PTP Clock Support"
|
||||
default n
|
||||
depends on IXGBE && PTP_1588_CLOCK
|
||||
depends on IXGBE && EXPERIMENTAL
|
||||
select PPS
|
||||
select PTP_1588_CLOCK
|
||||
---help---
|
||||
Say Y here if you want support for 1588 Timestamping with a
|
||||
PHC device, using the PTP 1588 Clock support. This is
|
||||
|
@ -206,8 +206,6 @@ static s32 igb_get_invariants_82575(struct e1000_hw *hw)
|
||||
mac->rar_entry_count = E1000_RAR_ENTRIES_82580;
|
||||
break;
|
||||
case e1000_i350:
|
||||
case e1000_i210:
|
||||
case e1000_i211:
|
||||
mac->rar_entry_count = E1000_RAR_ENTRIES_I350;
|
||||
break;
|
||||
default:
|
||||
|
@ -196,7 +196,7 @@ enum ixgbe_ring_state_t {
|
||||
__IXGBE_HANG_CHECK_ARMED,
|
||||
__IXGBE_RX_RSC_ENABLED,
|
||||
__IXGBE_RX_CSUM_UDP_ZERO_ERR,
|
||||
__IXGBE_RX_FCOE_BUFSZ,
|
||||
__IXGBE_RX_FCOE,
|
||||
};
|
||||
|
||||
#define check_for_tx_hang(ring) \
|
||||
@ -290,7 +290,7 @@ struct ixgbe_ring_feature {
|
||||
#if defined(IXGBE_FCOE) && (PAGE_SIZE < 8192)
|
||||
static inline unsigned int ixgbe_rx_pg_order(struct ixgbe_ring *ring)
|
||||
{
|
||||
return test_bit(__IXGBE_RX_FCOE_BUFSZ, &ring->state) ? 1 : 0;
|
||||
return test_bit(__IXGBE_RX_FCOE, &ring->state) ? 1 : 0;
|
||||
}
|
||||
#else
|
||||
#define ixgbe_rx_pg_order(_ring) 0
|
||||
|
@ -634,7 +634,7 @@ static int ixgbe_alloc_q_vector(struct ixgbe_adapter *adapter,
|
||||
f = &adapter->ring_feature[RING_F_FCOE];
|
||||
if ((rxr_idx >= f->mask) &&
|
||||
(rxr_idx < f->mask + f->indices))
|
||||
set_bit(__IXGBE_RX_FCOE_BUFSZ, &ring->state);
|
||||
set_bit(__IXGBE_RX_FCOE, &ring->state);
|
||||
}
|
||||
|
||||
#endif /* IXGBE_FCOE */
|
||||
|
@ -1058,17 +1058,17 @@ static inline void ixgbe_rx_hash(struct ixgbe_ring *ring,
|
||||
#ifdef IXGBE_FCOE
|
||||
/**
|
||||
* ixgbe_rx_is_fcoe - check the rx desc for incoming pkt type
|
||||
* @adapter: address of board private structure
|
||||
* @ring: structure containing ring specific data
|
||||
* @rx_desc: advanced rx descriptor
|
||||
*
|
||||
* Returns : true if it is FCoE pkt
|
||||
*/
|
||||
static inline bool ixgbe_rx_is_fcoe(struct ixgbe_adapter *adapter,
|
||||
static inline bool ixgbe_rx_is_fcoe(struct ixgbe_ring *ring,
|
||||
union ixgbe_adv_rx_desc *rx_desc)
|
||||
{
|
||||
__le16 pkt_info = rx_desc->wb.lower.lo_dword.hs_rss.pkt_info;
|
||||
|
||||
return (adapter->flags & IXGBE_FLAG_FCOE_ENABLED) &&
|
||||
return test_bit(__IXGBE_RX_FCOE, &ring->state) &&
|
||||
((pkt_info & cpu_to_le16(IXGBE_RXDADV_PKTTYPE_ETQF_MASK)) ==
|
||||
(cpu_to_le16(IXGBE_ETQF_FILTER_FCOE <<
|
||||
IXGBE_RXDADV_PKTTYPE_ETQF_SHIFT)));
|
||||
@ -1148,7 +1148,7 @@ static bool ixgbe_alloc_mapped_page(struct ixgbe_ring *rx_ring,
|
||||
|
||||
/* alloc new page for storage */
|
||||
if (likely(!page)) {
|
||||
page = alloc_pages(GFP_ATOMIC | __GFP_COLD,
|
||||
page = alloc_pages(GFP_ATOMIC | __GFP_COLD | __GFP_COMP,
|
||||
ixgbe_rx_pg_order(rx_ring));
|
||||
if (unlikely(!page)) {
|
||||
rx_ring->rx_stats.alloc_rx_page_failed++;
|
||||
@ -1549,6 +1549,12 @@ static bool ixgbe_cleanup_headers(struct ixgbe_ring *rx_ring,
|
||||
skb->truesize -= ixgbe_rx_bufsz(rx_ring);
|
||||
}
|
||||
|
||||
#ifdef IXGBE_FCOE
|
||||
/* do not attempt to pad FCoE Frames as this will disrupt DDP */
|
||||
if (ixgbe_rx_is_fcoe(rx_ring, rx_desc))
|
||||
return false;
|
||||
|
||||
#endif
|
||||
/* if skb_pad returns an error the skb was freed */
|
||||
if (unlikely(skb->len < 60)) {
|
||||
int pad_len = 60 - skb->len;
|
||||
@ -1775,7 +1781,7 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
|
||||
|
||||
#ifdef IXGBE_FCOE
|
||||
/* if ddp, not passing to ULD unless for FCP_RSP or error */
|
||||
if (ixgbe_rx_is_fcoe(adapter, rx_desc)) {
|
||||
if (ixgbe_rx_is_fcoe(rx_ring, rx_desc)) {
|
||||
ddp_bytes = ixgbe_fcoe_ddp(adapter, rx_desc, skb);
|
||||
if (!ddp_bytes) {
|
||||
dev_kfree_skb_any(skb);
|
||||
|
@ -708,6 +708,7 @@ void ixgbe_ptp_start_cyclecounter(struct ixgbe_adapter *adapter)
|
||||
{
|
||||
struct ixgbe_hw *hw = &adapter->hw;
|
||||
u32 incval = 0;
|
||||
u32 timinca = 0;
|
||||
u32 shift = 0;
|
||||
u32 cycle_speed;
|
||||
unsigned long flags;
|
||||
@ -730,8 +731,16 @@ void ixgbe_ptp_start_cyclecounter(struct ixgbe_adapter *adapter)
|
||||
break;
|
||||
}
|
||||
|
||||
/* Bail if the cycle speed didn't change */
|
||||
if (adapter->cycle_speed == cycle_speed)
|
||||
/*
|
||||
* grab the current TIMINCA value from the register so that it can be
|
||||
* double checked. If the register value has been cleared, it must be
|
||||
* reset to the correct value for generating a cyclecounter. If
|
||||
* TIMINCA is zero, the SYSTIME registers do not increment at all.
|
||||
*/
|
||||
timinca = IXGBE_READ_REG(hw, IXGBE_TIMINCA);
|
||||
|
||||
/* Bail if the cycle speed didn't change and TIMINCA is non-zero */
|
||||
if (adapter->cycle_speed == cycle_speed && timinca)
|
||||
return;
|
||||
|
||||
/* disable the SDP clock out */
|
||||
|
@ -929,15 +929,20 @@ void mlx4_en_free_resources(struct mlx4_en_priv *priv)
|
||||
if (priv->rx_cq[i].buf)
|
||||
mlx4_en_destroy_cq(priv, &priv->rx_cq[i]);
|
||||
}
|
||||
|
||||
if (priv->base_tx_qpn) {
|
||||
mlx4_qp_release_range(priv->mdev->dev, priv->base_tx_qpn, priv->tx_ring_num);
|
||||
priv->base_tx_qpn = 0;
|
||||
}
|
||||
}
|
||||
|
||||
int mlx4_en_alloc_resources(struct mlx4_en_priv *priv)
|
||||
{
|
||||
struct mlx4_en_port_profile *prof = priv->prof;
|
||||
int i;
|
||||
int base_tx_qpn, err;
|
||||
int err;
|
||||
|
||||
err = mlx4_qp_reserve_range(priv->mdev->dev, priv->tx_ring_num, 256, &base_tx_qpn);
|
||||
err = mlx4_qp_reserve_range(priv->mdev->dev, priv->tx_ring_num, 256, &priv->base_tx_qpn);
|
||||
if (err) {
|
||||
en_err(priv, "failed reserving range for TX rings\n");
|
||||
return err;
|
||||
@ -949,7 +954,7 @@ int mlx4_en_alloc_resources(struct mlx4_en_priv *priv)
|
||||
prof->tx_ring_size, i, TX))
|
||||
goto err;
|
||||
|
||||
if (mlx4_en_create_tx_ring(priv, &priv->tx_ring[i], base_tx_qpn + i,
|
||||
if (mlx4_en_create_tx_ring(priv, &priv->tx_ring[i], priv->base_tx_qpn + i,
|
||||
prof->tx_ring_size, TXBB_SIZE))
|
||||
goto err;
|
||||
}
|
||||
@ -969,7 +974,6 @@ int mlx4_en_alloc_resources(struct mlx4_en_priv *priv)
|
||||
|
||||
err:
|
||||
en_err(priv, "Failed to allocate NIC resources\n");
|
||||
mlx4_qp_release_range(priv->mdev->dev, base_tx_qpn, priv->tx_ring_num);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@ -1204,9 +1208,11 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
|
||||
en_warn(priv, "Using %d RX rings\n", prof->rx_ring_num);
|
||||
|
||||
/* Configure port */
|
||||
mlx4_en_calc_rx_buf(dev);
|
||||
err = mlx4_SET_PORT_general(mdev->dev, priv->port,
|
||||
MLX4_EN_MIN_MTU,
|
||||
0, 0, 0, 0);
|
||||
priv->rx_skb_size + ETH_FCS_LEN,
|
||||
prof->tx_pause, prof->tx_ppp,
|
||||
prof->rx_pause, prof->rx_ppp);
|
||||
if (err) {
|
||||
en_err(priv, "Failed setting port general configurations "
|
||||
"for port %d, with error %d\n", priv->port, err);
|
||||
|
@ -1975,6 +1975,8 @@ slave_start:
|
||||
if (err == -EBUSY && (dev->flags & MLX4_FLAG_MSI_X) &&
|
||||
!mlx4_is_mfunc(dev)) {
|
||||
dev->flags &= ~MLX4_FLAG_MSI_X;
|
||||
dev->caps.num_comp_vectors = 1;
|
||||
dev->caps.comp_pool = 0;
|
||||
pci_disable_msix(pdev);
|
||||
err = mlx4_setup_hca(dev);
|
||||
}
|
||||
|
@ -495,6 +495,7 @@ struct mlx4_en_priv {
|
||||
int vids[128];
|
||||
bool wol;
|
||||
struct device *ddev;
|
||||
int base_tx_qpn;
|
||||
|
||||
#ifdef CONFIG_MLX4_EN_DCB
|
||||
struct ieee_ets ets;
|
||||
|
@ -479,7 +479,7 @@ qlcnic_init_pci_info(struct qlcnic_adapter *adapter)
|
||||
|
||||
for (i = 0; i < QLCNIC_MAX_PCI_FUNC; i++) {
|
||||
pfn = pci_info[i].id;
|
||||
if (pfn > QLCNIC_MAX_PCI_FUNC) {
|
||||
if (pfn >= QLCNIC_MAX_PCI_FUNC) {
|
||||
ret = QL_STATUS_INVALID_PARAM;
|
||||
goto err_eswitch;
|
||||
}
|
||||
|
@ -3894,6 +3894,7 @@ static void rtl_init_rxcfg(struct rtl8169_private *tp)
|
||||
case RTL_GIGA_MAC_VER_22:
|
||||
case RTL_GIGA_MAC_VER_23:
|
||||
case RTL_GIGA_MAC_VER_24:
|
||||
case RTL_GIGA_MAC_VER_34:
|
||||
RTL_W32(RxConfig, RX128_INT_EN | RX_MULTI_EN | RX_DMA_BURST);
|
||||
break;
|
||||
default:
|
||||
|
@ -1011,7 +1011,7 @@ static int sh_eth_txfree(struct net_device *ndev)
|
||||
}
|
||||
|
||||
/* Packet receive function */
|
||||
static int sh_eth_rx(struct net_device *ndev)
|
||||
static int sh_eth_rx(struct net_device *ndev, u32 intr_status)
|
||||
{
|
||||
struct sh_eth_private *mdp = netdev_priv(ndev);
|
||||
struct sh_eth_rxdesc *rxdesc;
|
||||
@ -1102,9 +1102,11 @@ static int sh_eth_rx(struct net_device *ndev)
|
||||
/* Restart Rx engine if stopped. */
|
||||
/* If we don't need to check status, don't. -KDU */
|
||||
if (!(sh_eth_read(ndev, EDRRR) & EDRRR_R)) {
|
||||
/* fix the values for the next receiving */
|
||||
mdp->cur_rx = mdp->dirty_rx = (sh_eth_read(ndev, RDFAR) -
|
||||
sh_eth_read(ndev, RDLAR)) >> 4;
|
||||
/* fix the values for the next receiving if RDE is set */
|
||||
if (intr_status & EESR_RDE)
|
||||
mdp->cur_rx = mdp->dirty_rx =
|
||||
(sh_eth_read(ndev, RDFAR) -
|
||||
sh_eth_read(ndev, RDLAR)) >> 4;
|
||||
sh_eth_write(ndev, EDRRR_R, EDRRR);
|
||||
}
|
||||
|
||||
@ -1273,7 +1275,7 @@ static irqreturn_t sh_eth_interrupt(int irq, void *netdev)
|
||||
EESR_RTSF | /* short frame recv */
|
||||
EESR_PRE | /* PHY-LSI recv error */
|
||||
EESR_CERF)){ /* recv frame CRC error */
|
||||
sh_eth_rx(ndev);
|
||||
sh_eth_rx(ndev, intr_status);
|
||||
}
|
||||
|
||||
/* Tx Check */
|
||||
|
@ -161,7 +161,7 @@ static struct phy_driver ks8051_driver = {
|
||||
static struct phy_driver ks8001_driver = {
|
||||
.phy_id = PHY_ID_KS8001,
|
||||
.name = "Micrel KS8001 or KS8721",
|
||||
.phy_id_mask = 0x00fffff0,
|
||||
.phy_id_mask = 0x00ffffff,
|
||||
.features = (PHY_BASIC_FEATURES | SUPPORTED_Pause),
|
||||
.flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT,
|
||||
.config_init = kszphy_config_init,
|
||||
@ -174,7 +174,7 @@ static struct phy_driver ks8001_driver = {
|
||||
|
||||
static struct phy_driver ksz9021_driver = {
|
||||
.phy_id = PHY_ID_KSZ9021,
|
||||
.phy_id_mask = 0x000fff10,
|
||||
.phy_id_mask = 0x000ffffe,
|
||||
.name = "Micrel KSZ9021 Gigabit PHY",
|
||||
.features = (PHY_GBIT_FEATURES | SUPPORTED_Pause
|
||||
| SUPPORTED_Asym_Pause),
|
||||
@ -240,8 +240,8 @@ MODULE_AUTHOR("David J. Choi");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
static struct mdio_device_id __maybe_unused micrel_tbl[] = {
|
||||
{ PHY_ID_KSZ9021, 0x000fff10 },
|
||||
{ PHY_ID_KS8001, 0x00fffff0 },
|
||||
{ PHY_ID_KSZ9021, 0x000ffffe },
|
||||
{ PHY_ID_KS8001, 0x00ffffff },
|
||||
{ PHY_ID_KS8737, 0x00fffff0 },
|
||||
{ PHY_ID_KS8041, 0x00fffff0 },
|
||||
{ PHY_ID_KS8051, 0x00fffff0 },
|
||||
|
@ -59,6 +59,7 @@
|
||||
#define USB_PRODUCT_IPHONE_3G 0x1292
|
||||
#define USB_PRODUCT_IPHONE_3GS 0x1294
|
||||
#define USB_PRODUCT_IPHONE_4 0x1297
|
||||
#define USB_PRODUCT_IPAD 0x129a
|
||||
#define USB_PRODUCT_IPHONE_4_VZW 0x129c
|
||||
#define USB_PRODUCT_IPHONE_4S 0x12a0
|
||||
|
||||
@ -100,6 +101,10 @@ static struct usb_device_id ipheth_table[] = {
|
||||
USB_VENDOR_APPLE, USB_PRODUCT_IPHONE_4,
|
||||
IPHETH_USBINTF_CLASS, IPHETH_USBINTF_SUBCLASS,
|
||||
IPHETH_USBINTF_PROTO) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(
|
||||
USB_VENDOR_APPLE, USB_PRODUCT_IPAD,
|
||||
IPHETH_USBINTF_CLASS, IPHETH_USBINTF_SUBCLASS,
|
||||
IPHETH_USBINTF_PROTO) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(
|
||||
USB_VENDOR_APPLE, USB_PRODUCT_IPHONE_4_VZW,
|
||||
IPHETH_USBINTF_CLASS, IPHETH_USBINTF_SUBCLASS,
|
||||
|
@ -257,29 +257,6 @@ err:
|
||||
return rv;
|
||||
}
|
||||
|
||||
/* Gobi devices uses identical class/protocol codes for all interfaces regardless
|
||||
* of function. Some of these are CDC ACM like and have the exact same endpoints
|
||||
* we are looking for. This leaves two possible strategies for identifying the
|
||||
* correct interface:
|
||||
* a) hardcoding interface number, or
|
||||
* b) use the fact that the wwan interface is the only one lacking additional
|
||||
* (CDC functional) descriptors
|
||||
*
|
||||
* Let's see if we can get away with the generic b) solution.
|
||||
*/
|
||||
static int qmi_wwan_bind_gobi(struct usbnet *dev, struct usb_interface *intf)
|
||||
{
|
||||
int rv = -EINVAL;
|
||||
|
||||
/* ignore any interface with additional descriptors */
|
||||
if (intf->cur_altsetting->extralen)
|
||||
goto err;
|
||||
|
||||
rv = qmi_wwan_bind_shared(dev, intf);
|
||||
err:
|
||||
return rv;
|
||||
}
|
||||
|
||||
static void qmi_wwan_unbind_shared(struct usbnet *dev, struct usb_interface *intf)
|
||||
{
|
||||
struct usb_driver *subdriver = (void *)dev->data[0];
|
||||
@ -347,15 +324,15 @@ static const struct driver_info qmi_wwan_shared = {
|
||||
.manage_power = qmi_wwan_manage_power,
|
||||
};
|
||||
|
||||
static const struct driver_info qmi_wwan_gobi = {
|
||||
.description = "Qualcomm Gobi wwan/QMI device",
|
||||
static const struct driver_info qmi_wwan_force_int0 = {
|
||||
.description = "Qualcomm WWAN/QMI device",
|
||||
.flags = FLAG_WWAN,
|
||||
.bind = qmi_wwan_bind_gobi,
|
||||
.bind = qmi_wwan_bind_shared,
|
||||
.unbind = qmi_wwan_unbind_shared,
|
||||
.manage_power = qmi_wwan_manage_power,
|
||||
.data = BIT(0), /* interface whitelist bitmap */
|
||||
};
|
||||
|
||||
/* ZTE suck at making USB descriptors */
|
||||
static const struct driver_info qmi_wwan_force_int1 = {
|
||||
.description = "Qualcomm WWAN/QMI device",
|
||||
.flags = FLAG_WWAN,
|
||||
@ -365,6 +342,15 @@ static const struct driver_info qmi_wwan_force_int1 = {
|
||||
.data = BIT(1), /* interface whitelist bitmap */
|
||||
};
|
||||
|
||||
static const struct driver_info qmi_wwan_force_int3 = {
|
||||
.description = "Qualcomm WWAN/QMI device",
|
||||
.flags = FLAG_WWAN,
|
||||
.bind = qmi_wwan_bind_shared,
|
||||
.unbind = qmi_wwan_unbind_shared,
|
||||
.manage_power = qmi_wwan_manage_power,
|
||||
.data = BIT(3), /* interface whitelist bitmap */
|
||||
};
|
||||
|
||||
static const struct driver_info qmi_wwan_force_int4 = {
|
||||
.description = "Qualcomm WWAN/QMI device",
|
||||
.flags = FLAG_WWAN,
|
||||
@ -390,16 +376,23 @@ static const struct driver_info qmi_wwan_force_int4 = {
|
||||
static const struct driver_info qmi_wwan_sierra = {
|
||||
.description = "Sierra Wireless wwan/QMI device",
|
||||
.flags = FLAG_WWAN,
|
||||
.bind = qmi_wwan_bind_gobi,
|
||||
.bind = qmi_wwan_bind_shared,
|
||||
.unbind = qmi_wwan_unbind_shared,
|
||||
.manage_power = qmi_wwan_manage_power,
|
||||
.data = BIT(8) | BIT(19), /* interface whitelist bitmap */
|
||||
};
|
||||
|
||||
#define HUAWEI_VENDOR_ID 0x12D1
|
||||
|
||||
/* Gobi 1000 QMI/wwan interface number is 3 according to qcserial */
|
||||
#define QMI_GOBI1K_DEVICE(vend, prod) \
|
||||
USB_DEVICE(vend, prod), \
|
||||
.driver_info = (unsigned long)&qmi_wwan_force_int3
|
||||
|
||||
/* Gobi 2000 and Gobi 3000 QMI/wwan interface number is 0 according to qcserial */
|
||||
#define QMI_GOBI_DEVICE(vend, prod) \
|
||||
USB_DEVICE(vend, prod), \
|
||||
.driver_info = (unsigned long)&qmi_wwan_gobi
|
||||
.driver_info = (unsigned long)&qmi_wwan_force_int0
|
||||
|
||||
static const struct usb_device_id products[] = {
|
||||
{ /* Huawei E392, E398 and possibly others sharing both device id and more... */
|
||||
@ -510,20 +503,24 @@ static const struct usb_device_id products[] = {
|
||||
.bInterfaceProtocol = 0xff,
|
||||
.driver_info = (unsigned long)&qmi_wwan_sierra,
|
||||
},
|
||||
{QMI_GOBI_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */
|
||||
{QMI_GOBI_DEVICE(0x03f0, 0x1f1d)}, /* HP un2400 Gobi Modem Device */
|
||||
{QMI_GOBI_DEVICE(0x03f0, 0x371d)}, /* HP un2430 Mobile Broadband Module */
|
||||
{QMI_GOBI_DEVICE(0x04da, 0x250d)}, /* Panasonic Gobi Modem device */
|
||||
{QMI_GOBI_DEVICE(0x413c, 0x8172)}, /* Dell Gobi Modem device */
|
||||
{QMI_GOBI_DEVICE(0x1410, 0xa001)}, /* Novatel Gobi Modem device */
|
||||
{QMI_GOBI_DEVICE(0x0b05, 0x1776)}, /* Asus Gobi Modem device */
|
||||
{QMI_GOBI_DEVICE(0x19d2, 0xfff3)}, /* ONDA Gobi Modem device */
|
||||
{QMI_GOBI_DEVICE(0x05c6, 0x9001)}, /* Generic Gobi Modem device */
|
||||
{QMI_GOBI_DEVICE(0x05c6, 0x9002)}, /* Generic Gobi Modem device */
|
||||
{QMI_GOBI_DEVICE(0x05c6, 0x9202)}, /* Generic Gobi Modem device */
|
||||
{QMI_GOBI_DEVICE(0x05c6, 0x9203)}, /* Generic Gobi Modem device */
|
||||
{QMI_GOBI_DEVICE(0x05c6, 0x9222)}, /* Generic Gobi Modem device */
|
||||
{QMI_GOBI_DEVICE(0x05c6, 0x9009)}, /* Generic Gobi Modem device */
|
||||
|
||||
/* Gobi 1000 devices */
|
||||
{QMI_GOBI1K_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */
|
||||
{QMI_GOBI1K_DEVICE(0x03f0, 0x1f1d)}, /* HP un2400 Gobi Modem Device */
|
||||
{QMI_GOBI1K_DEVICE(0x03f0, 0x371d)}, /* HP un2430 Mobile Broadband Module */
|
||||
{QMI_GOBI1K_DEVICE(0x04da, 0x250d)}, /* Panasonic Gobi Modem device */
|
||||
{QMI_GOBI1K_DEVICE(0x413c, 0x8172)}, /* Dell Gobi Modem device */
|
||||
{QMI_GOBI1K_DEVICE(0x1410, 0xa001)}, /* Novatel Gobi Modem device */
|
||||
{QMI_GOBI1K_DEVICE(0x0b05, 0x1776)}, /* Asus Gobi Modem device */
|
||||
{QMI_GOBI1K_DEVICE(0x19d2, 0xfff3)}, /* ONDA Gobi Modem device */
|
||||
{QMI_GOBI1K_DEVICE(0x05c6, 0x9001)}, /* Generic Gobi Modem device */
|
||||
{QMI_GOBI1K_DEVICE(0x05c6, 0x9002)}, /* Generic Gobi Modem device */
|
||||
{QMI_GOBI1K_DEVICE(0x05c6, 0x9202)}, /* Generic Gobi Modem device */
|
||||
{QMI_GOBI1K_DEVICE(0x05c6, 0x9203)}, /* Generic Gobi Modem device */
|
||||
{QMI_GOBI1K_DEVICE(0x05c6, 0x9222)}, /* Generic Gobi Modem device */
|
||||
{QMI_GOBI1K_DEVICE(0x05c6, 0x9009)}, /* Generic Gobi Modem device */
|
||||
|
||||
/* Gobi 2000 and 3000 devices */
|
||||
{QMI_GOBI_DEVICE(0x413c, 0x8186)}, /* Dell Gobi 2000 Modem device (N0218, VU936) */
|
||||
{QMI_GOBI_DEVICE(0x05c6, 0x920b)}, /* Generic Gobi 2000 Modem device */
|
||||
{QMI_GOBI_DEVICE(0x05c6, 0x9225)}, /* Sony Gobi 2000 Modem device (N0279, VU730) */
|
||||
|
@ -796,11 +796,13 @@ int usbnet_open (struct net_device *net)
|
||||
if (info->manage_power) {
|
||||
retval = info->manage_power(dev, 1);
|
||||
if (retval < 0)
|
||||
goto done;
|
||||
goto done_manage_power_error;
|
||||
usb_autopm_put_interface(dev->intf);
|
||||
}
|
||||
return retval;
|
||||
|
||||
done_manage_power_error:
|
||||
clear_bit(EVENT_DEV_OPEN, &dev->flags);
|
||||
done:
|
||||
usb_autopm_put_interface(dev->intf);
|
||||
done_nopm:
|
||||
@ -876,9 +878,9 @@ void usbnet_get_drvinfo (struct net_device *net, struct ethtool_drvinfo *info)
|
||||
{
|
||||
struct usbnet *dev = netdev_priv(net);
|
||||
|
||||
strncpy (info->driver, dev->driver_name, sizeof info->driver);
|
||||
strncpy (info->version, DRIVER_VERSION, sizeof info->version);
|
||||
strncpy (info->fw_version, dev->driver_info->description,
|
||||
strlcpy (info->driver, dev->driver_name, sizeof info->driver);
|
||||
strlcpy (info->version, DRIVER_VERSION, sizeof info->version);
|
||||
strlcpy (info->fw_version, dev->driver_info->description,
|
||||
sizeof info->fw_version);
|
||||
usb_make_path (dev->udev, info->bus_info, sizeof info->bus_info);
|
||||
}
|
||||
@ -1202,6 +1204,21 @@ deferred:
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(usbnet_start_xmit);
|
||||
|
||||
static void rx_alloc_submit(struct usbnet *dev, gfp_t flags)
|
||||
{
|
||||
struct urb *urb;
|
||||
int i;
|
||||
|
||||
/* don't refill the queue all at once */
|
||||
for (i = 0; i < 10 && dev->rxq.qlen < RX_QLEN(dev); i++) {
|
||||
urb = usb_alloc_urb(0, flags);
|
||||
if (urb != NULL) {
|
||||
if (rx_submit(dev, urb, flags) == -ENOLINK)
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
// tasklet (work deferred from completions, in_irq) or timer
|
||||
@ -1241,26 +1258,14 @@ static void usbnet_bh (unsigned long param)
|
||||
!timer_pending (&dev->delay) &&
|
||||
!test_bit (EVENT_RX_HALT, &dev->flags)) {
|
||||
int temp = dev->rxq.qlen;
|
||||
int qlen = RX_QLEN (dev);
|
||||
|
||||
if (temp < qlen) {
|
||||
struct urb *urb;
|
||||
int i;
|
||||
|
||||
// don't refill the queue all at once
|
||||
for (i = 0; i < 10 && dev->rxq.qlen < qlen; i++) {
|
||||
urb = usb_alloc_urb (0, GFP_ATOMIC);
|
||||
if (urb != NULL) {
|
||||
if (rx_submit (dev, urb, GFP_ATOMIC) ==
|
||||
-ENOLINK)
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (temp < RX_QLEN(dev)) {
|
||||
rx_alloc_submit(dev, GFP_ATOMIC);
|
||||
if (temp != dev->rxq.qlen)
|
||||
netif_dbg(dev, link, dev->net,
|
||||
"rxqlen %d --> %d\n",
|
||||
temp, dev->rxq.qlen);
|
||||
if (dev->rxq.qlen < qlen)
|
||||
if (dev->rxq.qlen < RX_QLEN(dev))
|
||||
tasklet_schedule (&dev->bh);
|
||||
}
|
||||
if (dev->txq.qlen < TX_QLEN (dev))
|
||||
@ -1513,6 +1518,7 @@ int usbnet_suspend (struct usb_interface *intf, pm_message_t message)
|
||||
spin_lock_irq(&dev->txq.lock);
|
||||
/* don't autosuspend while transmitting */
|
||||
if (dev->txq.qlen && PMSG_IS_AUTO(message)) {
|
||||
dev->suspend_count--;
|
||||
spin_unlock_irq(&dev->txq.lock);
|
||||
return -EBUSY;
|
||||
} else {
|
||||
@ -1569,6 +1575,13 @@ int usbnet_resume (struct usb_interface *intf)
|
||||
spin_unlock_irq(&dev->txq.lock);
|
||||
|
||||
if (test_bit(EVENT_DEV_OPEN, &dev->flags)) {
|
||||
/* handle remote wakeup ASAP */
|
||||
if (!dev->wait &&
|
||||
netif_device_present(dev->net) &&
|
||||
!timer_pending(&dev->delay) &&
|
||||
!test_bit(EVENT_RX_HALT, &dev->flags))
|
||||
rx_alloc_submit(dev, GFP_KERNEL);
|
||||
|
||||
if (!(dev->txq.qlen >= TX_QLEN(dev)))
|
||||
netif_tx_wake_all_queues(dev->net);
|
||||
tasklet_schedule (&dev->bh);
|
||||
|
@ -7233,8 +7233,8 @@ static int airo_get_aplist(struct net_device *dev,
|
||||
}
|
||||
} else {
|
||||
dwrq->flags = 1; /* Should be define'd */
|
||||
memcpy(extra + sizeof(struct sockaddr)*i,
|
||||
&qual, sizeof(struct iw_quality)*i);
|
||||
memcpy(extra + sizeof(struct sockaddr) * i, qual,
|
||||
sizeof(struct iw_quality) * i);
|
||||
}
|
||||
dwrq->length = i;
|
||||
|
||||
|
@ -1045,11 +1045,11 @@ ath5k_drain_tx_buffs(struct ath5k_hw *ah)
|
||||
|
||||
ath5k_txbuf_free_skb(ah, bf);
|
||||
|
||||
spin_lock_bh(&ah->txbuflock);
|
||||
spin_lock(&ah->txbuflock);
|
||||
list_move_tail(&bf->list, &ah->txbuf);
|
||||
ah->txbuf_len++;
|
||||
txq->txq_len--;
|
||||
spin_unlock_bh(&ah->txbuflock);
|
||||
spin_unlock(&ah->txbuflock);
|
||||
}
|
||||
txq->link = NULL;
|
||||
txq->txq_poll_mark = false;
|
||||
|
@ -214,6 +214,7 @@ struct ath_frame_info {
|
||||
enum ath9k_key_type keytype;
|
||||
u8 keyix;
|
||||
u8 retries;
|
||||
u8 rtscts_rate;
|
||||
};
|
||||
|
||||
struct ath_buf_state {
|
||||
|
@ -1496,6 +1496,7 @@ static void ath9k_htc_bss_info_changed(struct ieee80211_hw *hw,
|
||||
priv->num_sta_assoc_vif++ : priv->num_sta_assoc_vif--;
|
||||
|
||||
if (priv->ah->opmode == NL80211_IFTYPE_STATION) {
|
||||
ath9k_htc_choose_set_bssid(priv);
|
||||
if (bss_conf->assoc && (priv->num_sta_assoc_vif == 1))
|
||||
ath9k_htc_start_ani(priv);
|
||||
else if (priv->num_sta_assoc_vif == 0)
|
||||
@ -1503,13 +1504,11 @@ static void ath9k_htc_bss_info_changed(struct ieee80211_hw *hw,
|
||||
}
|
||||
}
|
||||
|
||||
if (changed & BSS_CHANGED_BSSID) {
|
||||
if (changed & BSS_CHANGED_IBSS) {
|
||||
if (priv->ah->opmode == NL80211_IFTYPE_ADHOC) {
|
||||
common->curaid = bss_conf->aid;
|
||||
memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN);
|
||||
ath9k_htc_set_bssid(priv);
|
||||
} else if (priv->ah->opmode == NL80211_IFTYPE_STATION) {
|
||||
ath9k_htc_choose_set_bssid(priv);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -784,13 +784,25 @@ static void ath9k_hw_init_qos(struct ath_hw *ah)
|
||||
|
||||
u32 ar9003_get_pll_sqsum_dvc(struct ath_hw *ah)
|
||||
{
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
int i = 0;
|
||||
|
||||
REG_CLR_BIT(ah, PLL3, PLL3_DO_MEAS_MASK);
|
||||
udelay(100);
|
||||
REG_SET_BIT(ah, PLL3, PLL3_DO_MEAS_MASK);
|
||||
|
||||
while ((REG_READ(ah, PLL4) & PLL4_MEAS_DONE) == 0)
|
||||
while ((REG_READ(ah, PLL4) & PLL4_MEAS_DONE) == 0) {
|
||||
|
||||
udelay(100);
|
||||
|
||||
if (WARN_ON_ONCE(i >= 100)) {
|
||||
ath_err(common, "PLL4 meaurement not done\n");
|
||||
break;
|
||||
}
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
return (REG_READ(ah, PLL3) & SQSUM_DVC_MASK) >> 3;
|
||||
}
|
||||
EXPORT_SYMBOL(ar9003_get_pll_sqsum_dvc);
|
||||
|
@ -971,6 +971,15 @@ void ath_hw_pll_work(struct work_struct *work)
|
||||
hw_pll_work.work);
|
||||
u32 pll_sqsum;
|
||||
|
||||
/*
|
||||
* ensure that the PLL WAR is executed only
|
||||
* after the STA is associated (or) if the
|
||||
* beaconing had started in interfaces that
|
||||
* uses beacons.
|
||||
*/
|
||||
if (!(sc->sc_flags & SC_OP_BEACONS))
|
||||
return;
|
||||
|
||||
if (AR_SREV_9485(sc->sc_ah)) {
|
||||
|
||||
ath9k_ps_wakeup(sc);
|
||||
@ -1443,15 +1452,6 @@ static int ath9k_add_interface(struct ieee80211_hw *hw,
|
||||
}
|
||||
}
|
||||
|
||||
if ((ah->opmode == NL80211_IFTYPE_ADHOC) ||
|
||||
((vif->type == NL80211_IFTYPE_ADHOC) &&
|
||||
sc->nvifs > 0)) {
|
||||
ath_err(common, "Cannot create ADHOC interface when other"
|
||||
" interfaces already exist.\n");
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ath_dbg(common, CONFIG, "Attach a VIF of type: %d\n", vif->type);
|
||||
|
||||
sc->nvifs++;
|
||||
@ -1476,15 +1476,6 @@ static int ath9k_change_interface(struct ieee80211_hw *hw,
|
||||
mutex_lock(&sc->mutex);
|
||||
ath9k_ps_wakeup(sc);
|
||||
|
||||
/* See if new interface type is valid. */
|
||||
if ((new_type == NL80211_IFTYPE_ADHOC) &&
|
||||
(sc->nvifs > 1)) {
|
||||
ath_err(common, "When using ADHOC, it must be the only"
|
||||
" interface.\n");
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (ath9k_uses_beacons(new_type) &&
|
||||
!ath9k_uses_beacons(vif->type)) {
|
||||
if (sc->nbcnvifs >= ATH_BCBUF) {
|
||||
|
@ -938,6 +938,7 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf,
|
||||
struct ieee80211_tx_rate *rates;
|
||||
const struct ieee80211_rate *rate;
|
||||
struct ieee80211_hdr *hdr;
|
||||
struct ath_frame_info *fi = get_frame_info(bf->bf_mpdu);
|
||||
int i;
|
||||
u8 rix = 0;
|
||||
|
||||
@ -948,18 +949,7 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf,
|
||||
|
||||
/* set dur_update_en for l-sig computation except for PS-Poll frames */
|
||||
info->dur_update = !ieee80211_is_pspoll(hdr->frame_control);
|
||||
|
||||
/*
|
||||
* We check if Short Preamble is needed for the CTS rate by
|
||||
* checking the BSS's global flag.
|
||||
* But for the rate series, IEEE80211_TX_RC_USE_SHORT_PREAMBLE is used.
|
||||
*/
|
||||
rate = ieee80211_get_rts_cts_rate(sc->hw, tx_info);
|
||||
info->rtscts_rate = rate->hw_value;
|
||||
|
||||
if (tx_info->control.vif &&
|
||||
tx_info->control.vif->bss_conf.use_short_preamble)
|
||||
info->rtscts_rate |= rate->hw_value_short;
|
||||
info->rtscts_rate = fi->rtscts_rate;
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
bool is_40, is_sgi, is_sp;
|
||||
@ -1001,13 +991,13 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf,
|
||||
}
|
||||
|
||||
/* legacy rates */
|
||||
rate = &sc->sbands[tx_info->band].bitrates[rates[i].idx];
|
||||
if ((tx_info->band == IEEE80211_BAND_2GHZ) &&
|
||||
!(rate->flags & IEEE80211_RATE_ERP_G))
|
||||
phy = WLAN_RC_PHY_CCK;
|
||||
else
|
||||
phy = WLAN_RC_PHY_OFDM;
|
||||
|
||||
rate = &sc->sbands[tx_info->band].bitrates[rates[i].idx];
|
||||
info->rates[i].Rate = rate->hw_value;
|
||||
if (rate->hw_value_short) {
|
||||
if (rates[i].flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE)
|
||||
@ -1776,10 +1766,22 @@ static void setup_frame_info(struct ieee80211_hw *hw, struct sk_buff *skb,
|
||||
struct ieee80211_sta *sta = tx_info->control.sta;
|
||||
struct ieee80211_key_conf *hw_key = tx_info->control.hw_key;
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
||||
const struct ieee80211_rate *rate;
|
||||
struct ath_frame_info *fi = get_frame_info(skb);
|
||||
struct ath_node *an = NULL;
|
||||
enum ath9k_key_type keytype;
|
||||
bool short_preamble = false;
|
||||
|
||||
/*
|
||||
* We check if Short Preamble is needed for the CTS rate by
|
||||
* checking the BSS's global flag.
|
||||
* But for the rate series, IEEE80211_TX_RC_USE_SHORT_PREAMBLE is used.
|
||||
*/
|
||||
if (tx_info->control.vif &&
|
||||
tx_info->control.vif->bss_conf.use_short_preamble)
|
||||
short_preamble = true;
|
||||
|
||||
rate = ieee80211_get_rts_cts_rate(hw, tx_info);
|
||||
keytype = ath9k_cmn_get_hw_crypto_keytype(skb);
|
||||
|
||||
if (sta)
|
||||
@ -1794,6 +1796,9 @@ static void setup_frame_info(struct ieee80211_hw *hw, struct sk_buff *skb,
|
||||
fi->keyix = ATH9K_TXKEYIX_INVALID;
|
||||
fi->keytype = keytype;
|
||||
fi->framelen = framelen;
|
||||
fi->rtscts_rate = rate->hw_value;
|
||||
if (short_preamble)
|
||||
fi->rtscts_rate |= rate->hw_value_short;
|
||||
}
|
||||
|
||||
u8 ath_txchainmask_reduction(struct ath_softc *sc, u8 chainmask, u32 rate)
|
||||
|
@ -2239,6 +2239,7 @@ static ssize_t iwl_dbgfs_echo_test_write(struct file *file,
|
||||
return count;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_IWLWIFI_DEBUG
|
||||
static ssize_t iwl_dbgfs_log_event_read(struct file *file,
|
||||
char __user *user_buf,
|
||||
size_t count, loff_t *ppos)
|
||||
@ -2276,6 +2277,7 @@ static ssize_t iwl_dbgfs_log_event_write(struct file *file,
|
||||
|
||||
return count;
|
||||
}
|
||||
#endif
|
||||
|
||||
static ssize_t iwl_dbgfs_calib_disabled_read(struct file *file,
|
||||
char __user *user_buf,
|
||||
@ -2345,7 +2347,9 @@ DEBUGFS_READ_FILE_OPS(bt_traffic);
|
||||
DEBUGFS_READ_WRITE_FILE_OPS(protection_mode);
|
||||
DEBUGFS_READ_FILE_OPS(reply_tx_error);
|
||||
DEBUGFS_WRITE_FILE_OPS(echo_test);
|
||||
#ifdef CONFIG_IWLWIFI_DEBUG
|
||||
DEBUGFS_READ_WRITE_FILE_OPS(log_event);
|
||||
#endif
|
||||
DEBUGFS_READ_WRITE_FILE_OPS(calib_disabled);
|
||||
|
||||
/*
|
||||
@ -2405,7 +2409,9 @@ int iwl_dbgfs_register(struct iwl_priv *priv, const char *name)
|
||||
DEBUGFS_ADD_FILE(rxon_flags, dir_debug, S_IWUSR);
|
||||
DEBUGFS_ADD_FILE(rxon_filter_flags, dir_debug, S_IWUSR);
|
||||
DEBUGFS_ADD_FILE(echo_test, dir_debug, S_IWUSR);
|
||||
#ifdef CONFIG_IWLWIFI_DEBUG
|
||||
DEBUGFS_ADD_FILE(log_event, dir_debug, S_IWUSR | S_IRUSR);
|
||||
#endif
|
||||
|
||||
if (iwl_advanced_bt_coexist(priv))
|
||||
DEBUGFS_ADD_FILE(bt_traffic, dir_debug, S_IRUSR);
|
||||
|
@ -1484,7 +1484,7 @@ struct net_device *mwifiex_add_virtual_intf(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev;
|
||||
|
||||
if (!adapter)
|
||||
return NULL;
|
||||
return ERR_PTR(-EFAULT);
|
||||
|
||||
switch (type) {
|
||||
case NL80211_IFTYPE_UNSPECIFIED:
|
||||
@ -1494,12 +1494,12 @@ struct net_device *mwifiex_add_virtual_intf(struct wiphy *wiphy,
|
||||
if (priv->bss_mode) {
|
||||
wiphy_err(wiphy,
|
||||
"cannot create multiple sta/adhoc ifaces\n");
|
||||
return NULL;
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
wdev = kzalloc(sizeof(struct wireless_dev), GFP_KERNEL);
|
||||
if (!wdev)
|
||||
return NULL;
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
wdev->wiphy = wiphy;
|
||||
priv->wdev = wdev;
|
||||
@ -1522,12 +1522,12 @@ struct net_device *mwifiex_add_virtual_intf(struct wiphy *wiphy,
|
||||
|
||||
if (priv->bss_mode) {
|
||||
wiphy_err(wiphy, "Can't create multiple AP interfaces");
|
||||
return NULL;
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
wdev = kzalloc(sizeof(struct wireless_dev), GFP_KERNEL);
|
||||
if (!wdev)
|
||||
return NULL;
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
priv->wdev = wdev;
|
||||
wdev->wiphy = wiphy;
|
||||
@ -1544,14 +1544,15 @@ struct net_device *mwifiex_add_virtual_intf(struct wiphy *wiphy,
|
||||
break;
|
||||
default:
|
||||
wiphy_err(wiphy, "type not supported\n");
|
||||
return NULL;
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
dev = alloc_netdev_mq(sizeof(struct mwifiex_private *), name,
|
||||
ether_setup, 1);
|
||||
if (!dev) {
|
||||
wiphy_err(wiphy, "no memory available for netdevice\n");
|
||||
goto error;
|
||||
priv->bss_mode = NL80211_IFTYPE_UNSPECIFIED;
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
mwifiex_init_priv_params(priv, dev);
|
||||
@ -1582,7 +1583,9 @@ struct net_device *mwifiex_add_virtual_intf(struct wiphy *wiphy,
|
||||
/* Register network device */
|
||||
if (register_netdevice(dev)) {
|
||||
wiphy_err(wiphy, "cannot register virtual network device\n");
|
||||
goto error;
|
||||
free_netdev(dev);
|
||||
priv->bss_mode = NL80211_IFTYPE_UNSPECIFIED;
|
||||
return ERR_PTR(-EFAULT);
|
||||
}
|
||||
|
||||
sema_init(&priv->async_sem, 1);
|
||||
@ -1594,12 +1597,6 @@ struct net_device *mwifiex_add_virtual_intf(struct wiphy *wiphy,
|
||||
mwifiex_dev_debugfs_init(priv);
|
||||
#endif
|
||||
return dev;
|
||||
error:
|
||||
if (dev && (dev->reg_state == NETREG_UNREGISTERED))
|
||||
free_netdev(dev);
|
||||
priv->bss_mode = NL80211_IFTYPE_UNSPECIFIED;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mwifiex_add_virtual_intf);
|
||||
|
||||
|
@ -161,15 +161,11 @@ int mwifiex_write_data_complete(struct mwifiex_adapter *adapter,
|
||||
goto done;
|
||||
|
||||
for (i = 0; i < adapter->priv_num; i++) {
|
||||
|
||||
tpriv = adapter->priv[i];
|
||||
|
||||
if ((GET_BSS_ROLE(tpriv) == MWIFIEX_BSS_ROLE_STA) &&
|
||||
(tpriv->media_connected)) {
|
||||
if (netif_queue_stopped(tpriv->netdev))
|
||||
mwifiex_wake_up_net_dev_queue(tpriv->netdev,
|
||||
adapter);
|
||||
}
|
||||
if (tpriv->media_connected &&
|
||||
netif_queue_stopped(tpriv->netdev))
|
||||
mwifiex_wake_up_net_dev_queue(tpriv->netdev, adapter);
|
||||
}
|
||||
done:
|
||||
dev_kfree_skb_any(skb);
|
||||
|
@ -27,6 +27,17 @@ int mwifiex_set_secure_params(struct mwifiex_private *priv,
|
||||
struct cfg80211_ap_settings *params) {
|
||||
int i;
|
||||
|
||||
if (!params->privacy) {
|
||||
bss_config->protocol = PROTOCOL_NO_SECURITY;
|
||||
bss_config->key_mgmt = KEY_MGMT_NONE;
|
||||
bss_config->wpa_cfg.length = 0;
|
||||
priv->sec_info.wep_enabled = 0;
|
||||
priv->sec_info.wpa_enabled = 0;
|
||||
priv->sec_info.wpa2_enabled = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch (params->auth_type) {
|
||||
case NL80211_AUTHTYPE_OPEN_SYSTEM:
|
||||
bss_config->auth_mode = WLAN_AUTH_OPEN;
|
||||
|
@ -2110,7 +2110,7 @@ resize_buf:
|
||||
while (check_bssid_list_item(bssid, bssid_len, buf, len)) {
|
||||
if (rndis_bss_info_update(usbdev, bssid) && match_bssid &&
|
||||
matched) {
|
||||
if (!ether_addr_equal(bssid->mac, match_bssid))
|
||||
if (ether_addr_equal(bssid->mac, match_bssid))
|
||||
*matched = true;
|
||||
}
|
||||
|
||||
|
@ -869,7 +869,7 @@ int wl1251_acx_tsf_info(struct wl1251 *wl, u64 *mactime)
|
||||
}
|
||||
|
||||
*mactime = tsf_info->current_tsf_lsb |
|
||||
(tsf_info->current_tsf_msb << 31);
|
||||
((u64)tsf_info->current_tsf_msb << 32);
|
||||
|
||||
out:
|
||||
kfree(tsf_info);
|
||||
|
@ -76,8 +76,7 @@ static int wl1251_event_process(struct wl1251 *wl, struct event_mailbox *mbox)
|
||||
}
|
||||
}
|
||||
|
||||
if (vector & SYNCHRONIZATION_TIMEOUT_EVENT_ID &&
|
||||
wl->station_mode != STATION_ACTIVE_MODE) {
|
||||
if (vector & SYNCHRONIZATION_TIMEOUT_EVENT_ID) {
|
||||
wl1251_debug(DEBUG_EVENT, "SYNCHRONIZATION_TIMEOUT_EVENT");
|
||||
|
||||
/* indicate to the stack, that beacons have been lost */
|
||||
|
@ -73,6 +73,8 @@ static void wl1251_spi_reset(struct wl1251 *wl)
|
||||
spi_sync(wl_to_spi(wl), &m);
|
||||
|
||||
wl1251_dump(DEBUG_SPI, "spi reset -> ", cmd, WSPI_INIT_CMD_LEN);
|
||||
|
||||
kfree(cmd);
|
||||
}
|
||||
|
||||
static void wl1251_spi_wake(struct wl1251 *wl)
|
||||
@ -127,6 +129,8 @@ static void wl1251_spi_wake(struct wl1251 *wl)
|
||||
spi_sync(wl_to_spi(wl), &m);
|
||||
|
||||
wl1251_dump(DEBUG_SPI, "spi init -> ", cmd, WSPI_INIT_CMD_LEN);
|
||||
|
||||
kfree(cmd);
|
||||
}
|
||||
|
||||
static void wl1251_spi_reset_wake(struct wl1251 *wl)
|
||||
|
@ -1935,14 +1935,14 @@ static int __devexit xennet_remove(struct xenbus_device *dev)
|
||||
|
||||
dev_dbg(&dev->dev, "%s\n", dev->nodename);
|
||||
|
||||
unregister_netdev(info->netdev);
|
||||
|
||||
xennet_disconnect_backend(info);
|
||||
|
||||
del_timer_sync(&info->rx_refill_timer);
|
||||
|
||||
xennet_sysfs_delif(info->netdev);
|
||||
|
||||
unregister_netdev(info->netdev);
|
||||
|
||||
del_timer_sync(&info->rx_refill_timer);
|
||||
|
||||
free_percpu(info->stats);
|
||||
|
||||
free_netdev(info->netdev);
|
||||
|
@ -191,7 +191,9 @@ static int vhost_worker(void *data)
|
||||
struct vhost_dev *dev = data;
|
||||
struct vhost_work *work = NULL;
|
||||
unsigned uninitialized_var(seq);
|
||||
mm_segment_t oldfs = get_fs();
|
||||
|
||||
set_fs(USER_DS);
|
||||
use_mm(dev->mm);
|
||||
|
||||
for (;;) {
|
||||
@ -229,6 +231,7 @@ static int vhost_worker(void *data)
|
||||
|
||||
}
|
||||
unuse_mm(dev->mm);
|
||||
set_fs(oldfs);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -225,14 +225,11 @@ enum {
|
||||
/* device driver is going to provide hardware time stamp */
|
||||
SKBTX_IN_PROGRESS = 1 << 2,
|
||||
|
||||
/* ensure the originating sk reference is available on driver level */
|
||||
SKBTX_DRV_NEEDS_SK_REF = 1 << 3,
|
||||
|
||||
/* device driver supports TX zero-copy buffers */
|
||||
SKBTX_DEV_ZEROCOPY = 1 << 4,
|
||||
SKBTX_DEV_ZEROCOPY = 1 << 3,
|
||||
|
||||
/* generate wifi status information (where possible) */
|
||||
SKBTX_WIFI_STATUS = 1 << 5,
|
||||
SKBTX_WIFI_STATUS = 1 << 4,
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -1144,6 +1144,12 @@ struct extended_inquiry_info {
|
||||
__u8 data[240];
|
||||
} __packed;
|
||||
|
||||
#define HCI_EV_KEY_REFRESH_COMPLETE 0x30
|
||||
struct hci_ev_key_refresh_complete {
|
||||
__u8 status;
|
||||
__le16 handle;
|
||||
} __packed;
|
||||
|
||||
#define HCI_EV_IO_CAPA_REQUEST 0x31
|
||||
struct hci_ev_io_capa_request {
|
||||
bdaddr_t bdaddr;
|
||||
|
@ -1940,6 +1940,11 @@ enum ieee80211_rate_control_changed {
|
||||
* to also unregister the device. If it returns 1, then mac80211
|
||||
* will also go through the regular complete restart on resume.
|
||||
*
|
||||
* @set_wakeup: Enable or disable wakeup when WoWLAN configuration is
|
||||
* modified. The reason is that device_set_wakeup_enable() is
|
||||
* supposed to be called when the configuration changes, not only
|
||||
* in suspend().
|
||||
*
|
||||
* @add_interface: Called when a netdevice attached to the hardware is
|
||||
* enabled. Because it is not called for monitor mode devices, @start
|
||||
* and @stop must be implemented.
|
||||
@ -2966,6 +2971,7 @@ __le16 ieee80211_ctstoself_duration(struct ieee80211_hw *hw,
|
||||
* ieee80211_generic_frame_duration - Calculate the duration field for a frame
|
||||
* @hw: pointer obtained from ieee80211_alloc_hw().
|
||||
* @vif: &struct ieee80211_vif pointer from the add_interface callback.
|
||||
* @band: the band to calculate the frame duration on
|
||||
* @frame_len: the length of the frame.
|
||||
* @rate: the rate at which the frame is going to be transmitted.
|
||||
*
|
||||
|
@ -5,7 +5,7 @@
|
||||
*
|
||||
* Copyright (C) 2008 Nokia Corporation.
|
||||
*
|
||||
* Author: Rémi Denis-Courmont <remi.denis-courmont@nokia.com>
|
||||
* Author: Rémi Denis-Courmont
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
@ -368,7 +368,7 @@ p9pdu_vwritef(struct p9_fcall *pdu, int proto_version, const char *fmt,
|
||||
const char *sptr = va_arg(ap, const char *);
|
||||
uint16_t len = 0;
|
||||
if (sptr)
|
||||
len = min_t(uint16_t, strlen(sptr),
|
||||
len = min_t(size_t, strlen(sptr),
|
||||
USHRT_MAX);
|
||||
|
||||
errcode = p9pdu_writef(pdu, proto_version,
|
||||
|
@ -617,6 +617,8 @@ int recv_tt_query(struct sk_buff *skb, struct hard_iface *recv_if)
|
||||
* changes */
|
||||
if (skb_linearize(skb) < 0)
|
||||
goto out;
|
||||
/* skb_linearize() possibly changed skb->data */
|
||||
tt_query = (struct tt_query_packet *)skb->data;
|
||||
|
||||
tt_len = tt_query->tt_data * sizeof(struct tt_change);
|
||||
|
||||
|
@ -141,13 +141,14 @@ static void tt_orig_list_entry_free_rcu(struct rcu_head *rcu)
|
||||
struct tt_orig_list_entry *orig_entry;
|
||||
|
||||
orig_entry = container_of(rcu, struct tt_orig_list_entry, rcu);
|
||||
atomic_dec(&orig_entry->orig_node->tt_size);
|
||||
orig_node_free_ref(orig_entry->orig_node);
|
||||
kfree(orig_entry);
|
||||
}
|
||||
|
||||
static void tt_orig_list_entry_free_ref(struct tt_orig_list_entry *orig_entry)
|
||||
{
|
||||
/* to avoid race conditions, immediately decrease the tt counter */
|
||||
atomic_dec(&orig_entry->orig_node->tt_size);
|
||||
call_rcu(&orig_entry->rcu, tt_orig_list_entry_free_rcu);
|
||||
}
|
||||
|
||||
@ -910,7 +911,6 @@ void tt_global_del_orig(struct bat_priv *bat_priv,
|
||||
}
|
||||
spin_unlock_bh(list_lock);
|
||||
}
|
||||
atomic_set(&orig_node->tt_size, 0);
|
||||
orig_node->tt_initialised = false;
|
||||
}
|
||||
|
||||
@ -2031,10 +2031,10 @@ bool is_ap_isolated(struct bat_priv *bat_priv, uint8_t *src, uint8_t *dst)
|
||||
{
|
||||
struct tt_local_entry *tt_local_entry = NULL;
|
||||
struct tt_global_entry *tt_global_entry = NULL;
|
||||
bool ret = true;
|
||||
bool ret = false;
|
||||
|
||||
if (!atomic_read(&bat_priv->ap_isolation))
|
||||
return false;
|
||||
goto out;
|
||||
|
||||
tt_local_entry = tt_local_hash_find(bat_priv, dst);
|
||||
if (!tt_local_entry)
|
||||
@ -2044,10 +2044,10 @@ bool is_ap_isolated(struct bat_priv *bat_priv, uint8_t *src, uint8_t *dst)
|
||||
if (!tt_global_entry)
|
||||
goto out;
|
||||
|
||||
if (_is_ap_isolated(tt_local_entry, tt_global_entry))
|
||||
if (!_is_ap_isolated(tt_local_entry, tt_global_entry))
|
||||
goto out;
|
||||
|
||||
ret = false;
|
||||
ret = true;
|
||||
|
||||
out:
|
||||
if (tt_global_entry)
|
||||
|
@ -3043,6 +3043,50 @@ static inline void hci_extended_inquiry_result_evt(struct hci_dev *hdev, struct
|
||||
hci_dev_unlock(hdev);
|
||||
}
|
||||
|
||||
static void hci_key_refresh_complete_evt(struct hci_dev *hdev,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
struct hci_ev_key_refresh_complete *ev = (void *) skb->data;
|
||||
struct hci_conn *conn;
|
||||
|
||||
BT_DBG("%s status %u handle %u", hdev->name, ev->status,
|
||||
__le16_to_cpu(ev->handle));
|
||||
|
||||
hci_dev_lock(hdev);
|
||||
|
||||
conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
|
||||
if (!conn)
|
||||
goto unlock;
|
||||
|
||||
if (!ev->status)
|
||||
conn->sec_level = conn->pending_sec_level;
|
||||
|
||||
clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
|
||||
|
||||
if (ev->status && conn->state == BT_CONNECTED) {
|
||||
hci_acl_disconn(conn, HCI_ERROR_AUTH_FAILURE);
|
||||
hci_conn_put(conn);
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
if (conn->state == BT_CONFIG) {
|
||||
if (!ev->status)
|
||||
conn->state = BT_CONNECTED;
|
||||
|
||||
hci_proto_connect_cfm(conn, ev->status);
|
||||
hci_conn_put(conn);
|
||||
} else {
|
||||
hci_auth_cfm(conn, ev->status);
|
||||
|
||||
hci_conn_hold(conn);
|
||||
conn->disc_timeout = HCI_DISCONN_TIMEOUT;
|
||||
hci_conn_put(conn);
|
||||
}
|
||||
|
||||
unlock:
|
||||
hci_dev_unlock(hdev);
|
||||
}
|
||||
|
||||
static inline u8 hci_get_auth_req(struct hci_conn *conn)
|
||||
{
|
||||
/* If remote requests dedicated bonding follow that lead */
|
||||
@ -3559,6 +3603,10 @@ void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)
|
||||
hci_extended_inquiry_result_evt(hdev, skb);
|
||||
break;
|
||||
|
||||
case HCI_EV_KEY_REFRESH_COMPLETE:
|
||||
hci_key_refresh_complete_evt(hdev, skb);
|
||||
break;
|
||||
|
||||
case HCI_EV_IO_CAPA_REQUEST:
|
||||
hci_io_capa_request_evt(hdev, skb);
|
||||
break;
|
||||
|
@ -1295,7 +1295,12 @@ static void security_timeout(struct work_struct *work)
|
||||
struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
|
||||
security_timer.work);
|
||||
|
||||
l2cap_conn_del(conn->hcon, ETIMEDOUT);
|
||||
BT_DBG("conn %p", conn);
|
||||
|
||||
if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags)) {
|
||||
smp_chan_destroy(conn);
|
||||
l2cap_conn_del(conn->hcon, ETIMEDOUT);
|
||||
}
|
||||
}
|
||||
|
||||
static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon, u8 status)
|
||||
@ -2910,12 +2915,14 @@ static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len)
|
||||
while (len >= L2CAP_CONF_OPT_SIZE) {
|
||||
len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
|
||||
|
||||
switch (type) {
|
||||
case L2CAP_CONF_RFC:
|
||||
if (olen == sizeof(rfc))
|
||||
memcpy(&rfc, (void *)val, olen);
|
||||
goto done;
|
||||
}
|
||||
if (type != L2CAP_CONF_RFC)
|
||||
continue;
|
||||
|
||||
if (olen != sizeof(rfc))
|
||||
break;
|
||||
|
||||
memcpy(&rfc, (void *)val, olen);
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Use sane default values in case a misbehaving remote device
|
||||
|
@ -1598,7 +1598,7 @@ static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data,
|
||||
else
|
||||
conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->addr.bdaddr);
|
||||
|
||||
if (!conn) {
|
||||
if (!conn || conn->state == BT_OPEN || conn->state == BT_CLOSED) {
|
||||
err = cmd_status(sk, hdev->id, MGMT_OP_DISCONNECT,
|
||||
MGMT_STATUS_NOT_CONNECTED);
|
||||
goto failed;
|
||||
@ -1873,6 +1873,22 @@ static void pairing_complete_cb(struct hci_conn *conn, u8 status)
|
||||
pairing_complete(cmd, mgmt_status(status));
|
||||
}
|
||||
|
||||
static void le_connect_complete_cb(struct hci_conn *conn, u8 status)
|
||||
{
|
||||
struct pending_cmd *cmd;
|
||||
|
||||
BT_DBG("status %u", status);
|
||||
|
||||
if (!status)
|
||||
return;
|
||||
|
||||
cmd = find_pairing(conn);
|
||||
if (!cmd)
|
||||
BT_DBG("Unable to find a pending command");
|
||||
else
|
||||
pairing_complete(cmd, mgmt_status(status));
|
||||
}
|
||||
|
||||
static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
|
||||
u16 len)
|
||||
{
|
||||
@ -1934,6 +1950,8 @@ static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
|
||||
/* For LE, just connecting isn't a proof that the pairing finished */
|
||||
if (cp->addr.type == BDADDR_BREDR)
|
||||
conn->connect_cfm_cb = pairing_complete_cb;
|
||||
else
|
||||
conn->connect_cfm_cb = le_connect_complete_cb;
|
||||
|
||||
conn->security_cfm_cb = pairing_complete_cb;
|
||||
conn->disconn_cfm_cb = pairing_complete_cb;
|
||||
|
@ -648,7 +648,7 @@ static u8 smp_cmd_pairing_rsp(struct l2cap_conn *conn, struct sk_buff *skb)
|
||||
|
||||
auth |= (req->auth_req | rsp->auth_req) & SMP_AUTH_MITM;
|
||||
|
||||
ret = tk_request(conn, 0, auth, rsp->io_capability, req->io_capability);
|
||||
ret = tk_request(conn, 0, auth, req->io_capability, rsp->io_capability);
|
||||
if (ret)
|
||||
return SMP_UNSPECIFIED;
|
||||
|
||||
@ -703,7 +703,7 @@ static u8 smp_cmd_pairing_random(struct l2cap_conn *conn, struct sk_buff *skb)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static u8 smp_ltk_encrypt(struct l2cap_conn *conn)
|
||||
static u8 smp_ltk_encrypt(struct l2cap_conn *conn, u8 sec_level)
|
||||
{
|
||||
struct smp_ltk *key;
|
||||
struct hci_conn *hcon = conn->hcon;
|
||||
@ -712,6 +712,9 @@ static u8 smp_ltk_encrypt(struct l2cap_conn *conn)
|
||||
if (!key)
|
||||
return 0;
|
||||
|
||||
if (sec_level > BT_SECURITY_MEDIUM && !key->authenticated)
|
||||
return 0;
|
||||
|
||||
if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
|
||||
return 1;
|
||||
|
||||
@ -732,7 +735,7 @@ static u8 smp_cmd_security_req(struct l2cap_conn *conn, struct sk_buff *skb)
|
||||
|
||||
hcon->pending_sec_level = authreq_to_seclevel(rp->auth_req);
|
||||
|
||||
if (smp_ltk_encrypt(conn))
|
||||
if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
|
||||
return 0;
|
||||
|
||||
if (test_and_set_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags))
|
||||
@ -771,7 +774,7 @@ int smp_conn_security(struct l2cap_conn *conn, __u8 sec_level)
|
||||
return 1;
|
||||
|
||||
if (hcon->link_mode & HCI_LM_MASTER)
|
||||
if (smp_ltk_encrypt(conn))
|
||||
if (smp_ltk_encrypt(conn, sec_level))
|
||||
goto done;
|
||||
|
||||
if (test_and_set_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags))
|
||||
|
@ -240,6 +240,7 @@ int br_add_bridge(struct net *net, const char *name)
|
||||
return -ENOMEM;
|
||||
|
||||
dev_net_set(dev, net);
|
||||
dev->rtnl_link_ops = &br_link_ops;
|
||||
|
||||
res = register_netdev(dev);
|
||||
if (res)
|
||||
|
@ -208,7 +208,7 @@ static int br_validate(struct nlattr *tb[], struct nlattr *data[])
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct rtnl_link_ops br_link_ops __read_mostly = {
|
||||
struct rtnl_link_ops br_link_ops __read_mostly = {
|
||||
.kind = "bridge",
|
||||
.priv_size = sizeof(struct net_bridge),
|
||||
.setup = br_dev_setup,
|
||||
|
@ -549,6 +549,7 @@ extern int (*br_fdb_test_addr_hook)(struct net_device *dev, unsigned char *addr)
|
||||
#endif
|
||||
|
||||
/* br_netlink.c */
|
||||
extern struct rtnl_link_ops br_link_ops;
|
||||
extern int br_netlink_init(void);
|
||||
extern void br_netlink_fini(void);
|
||||
extern void br_ifinfo_notify(int event, struct net_bridge_port *port);
|
||||
|
@ -4,8 +4,7 @@
|
||||
* Author: Sjur Brendeland/sjur.brandeland@stericsson.com
|
||||
* License terms: GNU General Public License (GPL) version 2
|
||||
*
|
||||
* Borrowed heavily from file: pn_dev.c. Thanks to
|
||||
* Remi Denis-Courmont <remi.denis-courmont@nokia.com>
|
||||
* Borrowed heavily from file: pn_dev.c. Thanks to Remi Denis-Courmont
|
||||
* and Sakari Ailus <sakari.ailus@nokia.com>
|
||||
*/
|
||||
|
||||
|
@ -220,6 +220,7 @@ static void caif_ctrl_cb(struct cflayer *layr,
|
||||
cfsk_hold, cfsk_put);
|
||||
cf_sk->sk.sk_state = CAIF_CONNECTED;
|
||||
set_tx_flow_on(cf_sk);
|
||||
cf_sk->sk.sk_shutdown = 0;
|
||||
cf_sk->sk.sk_state_change(&cf_sk->sk);
|
||||
break;
|
||||
|
||||
|
@ -681,9 +681,6 @@ static int raw_sendmsg(struct kiocb *iocb, struct socket *sock,
|
||||
if (err < 0)
|
||||
goto free_skb;
|
||||
|
||||
/* to be able to check the received tx sock reference in raw_rcv() */
|
||||
skb_shinfo(skb)->tx_flags |= SKBTX_DRV_NEEDS_SK_REF;
|
||||
|
||||
skb->dev = dev;
|
||||
skb->sk = sk;
|
||||
|
||||
|
@ -2089,25 +2089,6 @@ static int dev_gso_segment(struct sk_buff *skb, netdev_features_t features)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Try to orphan skb early, right before transmission by the device.
|
||||
* We cannot orphan skb if tx timestamp is requested or the sk-reference
|
||||
* is needed on driver level for other reasons, e.g. see net/can/raw.c
|
||||
*/
|
||||
static inline void skb_orphan_try(struct sk_buff *skb)
|
||||
{
|
||||
struct sock *sk = skb->sk;
|
||||
|
||||
if (sk && !skb_shinfo(skb)->tx_flags) {
|
||||
/* skb_tx_hash() wont be able to get sk.
|
||||
* We copy sk_hash into skb->rxhash
|
||||
*/
|
||||
if (!skb->rxhash)
|
||||
skb->rxhash = sk->sk_hash;
|
||||
skb_orphan(skb);
|
||||
}
|
||||
}
|
||||
|
||||
static bool can_checksum_protocol(netdev_features_t features, __be16 protocol)
|
||||
{
|
||||
return ((features & NETIF_F_GEN_CSUM) ||
|
||||
@ -2193,8 +2174,6 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
|
||||
if (!list_empty(&ptype_all))
|
||||
dev_queue_xmit_nit(skb, dev);
|
||||
|
||||
skb_orphan_try(skb);
|
||||
|
||||
features = netif_skb_features(skb);
|
||||
|
||||
if (vlan_tx_tag_present(skb) &&
|
||||
@ -2304,7 +2283,7 @@ u16 __skb_tx_hash(const struct net_device *dev, const struct sk_buff *skb,
|
||||
if (skb->sk && skb->sk->sk_hash)
|
||||
hash = skb->sk->sk_hash;
|
||||
else
|
||||
hash = (__force u16) skb->protocol ^ skb->rxhash;
|
||||
hash = (__force u16) skb->protocol;
|
||||
hash = jhash_1word(hash, hashrnd);
|
||||
|
||||
return (u16) (((u64) hash * qcount) >> 32) + qoffset;
|
||||
|
@ -1349,8 +1349,8 @@ static int fib6_walk_continue(struct fib6_walker_t *w)
|
||||
if (w->leaf && fn->fn_flags & RTN_RTINFO) {
|
||||
int err;
|
||||
|
||||
if (w->count < w->skip) {
|
||||
w->count++;
|
||||
if (w->skip) {
|
||||
w->skip--;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -2957,10 +2957,6 @@ static int __net_init ip6_route_net_init(struct net *net)
|
||||
net->ipv6.sysctl.ip6_rt_mtu_expires = 10*60*HZ;
|
||||
net->ipv6.sysctl.ip6_rt_min_advmss = IPV6_MIN_MTU - 20 - 40;
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
proc_net_fops_create(net, "ipv6_route", 0, &ipv6_route_proc_fops);
|
||||
proc_net_fops_create(net, "rt6_stats", S_IRUGO, &rt6_stats_seq_fops);
|
||||
#endif
|
||||
net->ipv6.ip6_rt_gc_expire = 30*HZ;
|
||||
|
||||
ret = 0;
|
||||
@ -2981,10 +2977,6 @@ out_ip6_dst_ops:
|
||||
|
||||
static void __net_exit ip6_route_net_exit(struct net *net)
|
||||
{
|
||||
#ifdef CONFIG_PROC_FS
|
||||
proc_net_remove(net, "ipv6_route");
|
||||
proc_net_remove(net, "rt6_stats");
|
||||
#endif
|
||||
kfree(net->ipv6.ip6_null_entry);
|
||||
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
|
||||
kfree(net->ipv6.ip6_prohibit_entry);
|
||||
@ -2993,11 +2985,33 @@ static void __net_exit ip6_route_net_exit(struct net *net)
|
||||
dst_entries_destroy(&net->ipv6.ip6_dst_ops);
|
||||
}
|
||||
|
||||
static int __net_init ip6_route_net_init_late(struct net *net)
|
||||
{
|
||||
#ifdef CONFIG_PROC_FS
|
||||
proc_net_fops_create(net, "ipv6_route", 0, &ipv6_route_proc_fops);
|
||||
proc_net_fops_create(net, "rt6_stats", S_IRUGO, &rt6_stats_seq_fops);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __net_exit ip6_route_net_exit_late(struct net *net)
|
||||
{
|
||||
#ifdef CONFIG_PROC_FS
|
||||
proc_net_remove(net, "ipv6_route");
|
||||
proc_net_remove(net, "rt6_stats");
|
||||
#endif
|
||||
}
|
||||
|
||||
static struct pernet_operations ip6_route_net_ops = {
|
||||
.init = ip6_route_net_init,
|
||||
.exit = ip6_route_net_exit,
|
||||
};
|
||||
|
||||
static struct pernet_operations ip6_route_net_late_ops = {
|
||||
.init = ip6_route_net_init_late,
|
||||
.exit = ip6_route_net_exit_late,
|
||||
};
|
||||
|
||||
static struct notifier_block ip6_route_dev_notifier = {
|
||||
.notifier_call = ip6_route_dev_notify,
|
||||
.priority = 0,
|
||||
@ -3047,19 +3061,25 @@ int __init ip6_route_init(void)
|
||||
if (ret)
|
||||
goto xfrm6_init;
|
||||
|
||||
ret = register_pernet_subsys(&ip6_route_net_late_ops);
|
||||
if (ret)
|
||||
goto fib6_rules_init;
|
||||
|
||||
ret = -ENOBUFS;
|
||||
if (__rtnl_register(PF_INET6, RTM_NEWROUTE, inet6_rtm_newroute, NULL, NULL) ||
|
||||
__rtnl_register(PF_INET6, RTM_DELROUTE, inet6_rtm_delroute, NULL, NULL) ||
|
||||
__rtnl_register(PF_INET6, RTM_GETROUTE, inet6_rtm_getroute, NULL, NULL))
|
||||
goto fib6_rules_init;
|
||||
goto out_register_late_subsys;
|
||||
|
||||
ret = register_netdevice_notifier(&ip6_route_dev_notifier);
|
||||
if (ret)
|
||||
goto fib6_rules_init;
|
||||
goto out_register_late_subsys;
|
||||
|
||||
out:
|
||||
return ret;
|
||||
|
||||
out_register_late_subsys:
|
||||
unregister_pernet_subsys(&ip6_route_net_late_ops);
|
||||
fib6_rules_init:
|
||||
fib6_rules_cleanup();
|
||||
xfrm6_init:
|
||||
@ -3078,6 +3098,7 @@ out_kmem_cache:
|
||||
void ip6_route_cleanup(void)
|
||||
{
|
||||
unregister_netdevice_notifier(&ip6_route_dev_notifier);
|
||||
unregister_pernet_subsys(&ip6_route_net_late_ops);
|
||||
fib6_rules_cleanup();
|
||||
xfrm6_fini();
|
||||
fib6_gc_cleanup();
|
||||
|
@ -1212,7 +1212,8 @@ have_isn:
|
||||
tcp_rsk(req)->snt_isn = isn;
|
||||
tcp_rsk(req)->snt_synack = tcp_time_stamp;
|
||||
|
||||
security_inet_conn_request(sk, skb, req);
|
||||
if (security_inet_conn_request(sk, skb, req))
|
||||
goto drop_and_release;
|
||||
|
||||
if (tcp_v6_send_synack(sk, req,
|
||||
(struct request_values *)&tmp_ext,
|
||||
|
@ -372,7 +372,6 @@ static int afiucv_hs_send(struct iucv_message *imsg, struct sock *sock,
|
||||
skb_trim(skb, skb->dev->mtu);
|
||||
}
|
||||
skb->protocol = ETH_P_AF_IUCV;
|
||||
skb_shinfo(skb)->tx_flags |= SKBTX_DRV_NEEDS_SK_REF;
|
||||
nskb = skb_clone(skb, GFP_ATOMIC);
|
||||
if (!nskb)
|
||||
return -ENOMEM;
|
||||
|
@ -42,6 +42,11 @@ struct l2tp_eth {
|
||||
struct sock *tunnel_sock;
|
||||
struct l2tp_session *session;
|
||||
struct list_head list;
|
||||
atomic_long_t tx_bytes;
|
||||
atomic_long_t tx_packets;
|
||||
atomic_long_t rx_bytes;
|
||||
atomic_long_t rx_packets;
|
||||
atomic_long_t rx_errors;
|
||||
};
|
||||
|
||||
/* via l2tp_session_priv() */
|
||||
@ -88,24 +93,40 @@ static int l2tp_eth_dev_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
struct l2tp_eth *priv = netdev_priv(dev);
|
||||
struct l2tp_session *session = priv->session;
|
||||
|
||||
atomic_long_add(skb->len, &priv->tx_bytes);
|
||||
atomic_long_inc(&priv->tx_packets);
|
||||
|
||||
l2tp_xmit_skb(session, skb, session->hdr_len);
|
||||
|
||||
dev->stats.tx_bytes += skb->len;
|
||||
dev->stats.tx_packets++;
|
||||
|
||||
return 0;
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
static struct rtnl_link_stats64 *l2tp_eth_get_stats64(struct net_device *dev,
|
||||
struct rtnl_link_stats64 *stats)
|
||||
{
|
||||
struct l2tp_eth *priv = netdev_priv(dev);
|
||||
|
||||
stats->tx_bytes = atomic_long_read(&priv->tx_bytes);
|
||||
stats->tx_packets = atomic_long_read(&priv->tx_packets);
|
||||
stats->rx_bytes = atomic_long_read(&priv->rx_bytes);
|
||||
stats->rx_packets = atomic_long_read(&priv->rx_packets);
|
||||
stats->rx_errors = atomic_long_read(&priv->rx_errors);
|
||||
return stats;
|
||||
}
|
||||
|
||||
|
||||
static struct net_device_ops l2tp_eth_netdev_ops = {
|
||||
.ndo_init = l2tp_eth_dev_init,
|
||||
.ndo_uninit = l2tp_eth_dev_uninit,
|
||||
.ndo_start_xmit = l2tp_eth_dev_xmit,
|
||||
.ndo_get_stats64 = l2tp_eth_get_stats64,
|
||||
};
|
||||
|
||||
static void l2tp_eth_dev_setup(struct net_device *dev)
|
||||
{
|
||||
ether_setup(dev);
|
||||
dev->priv_flags &= ~IFF_TX_SKB_SHARING;
|
||||
dev->priv_flags &= ~IFF_TX_SKB_SHARING;
|
||||
dev->features |= NETIF_F_LLTX;
|
||||
dev->netdev_ops = &l2tp_eth_netdev_ops;
|
||||
dev->destructor = free_netdev;
|
||||
}
|
||||
@ -114,17 +135,17 @@ static void l2tp_eth_dev_recv(struct l2tp_session *session, struct sk_buff *skb,
|
||||
{
|
||||
struct l2tp_eth_sess *spriv = l2tp_session_priv(session);
|
||||
struct net_device *dev = spriv->dev;
|
||||
struct l2tp_eth *priv = netdev_priv(dev);
|
||||
|
||||
if (session->debug & L2TP_MSG_DATA) {
|
||||
unsigned int length;
|
||||
u8 *ptr = skb->data;
|
||||
|
||||
length = min(32u, skb->len);
|
||||
if (!pskb_may_pull(skb, length))
|
||||
goto error;
|
||||
|
||||
pr_debug("%s: eth recv\n", session->name);
|
||||
print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, ptr, length);
|
||||
print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, skb->data, length);
|
||||
}
|
||||
|
||||
if (!pskb_may_pull(skb, sizeof(ETH_HLEN)))
|
||||
@ -139,15 +160,15 @@ static void l2tp_eth_dev_recv(struct l2tp_session *session, struct sk_buff *skb,
|
||||
nf_reset(skb);
|
||||
|
||||
if (dev_forward_skb(dev, skb) == NET_RX_SUCCESS) {
|
||||
dev->stats.rx_packets++;
|
||||
dev->stats.rx_bytes += data_len;
|
||||
} else
|
||||
dev->stats.rx_errors++;
|
||||
|
||||
atomic_long_inc(&priv->rx_packets);
|
||||
atomic_long_add(data_len, &priv->rx_bytes);
|
||||
} else {
|
||||
atomic_long_inc(&priv->rx_errors);
|
||||
}
|
||||
return;
|
||||
|
||||
error:
|
||||
dev->stats.rx_errors++;
|
||||
atomic_long_inc(&priv->rx_errors);
|
||||
kfree_skb(skb);
|
||||
}
|
||||
|
||||
|
@ -2093,6 +2093,9 @@ static int ieee80211_set_bitrate_mask(struct wiphy *wiphy,
|
||||
struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
|
||||
int i, ret;
|
||||
|
||||
if (!ieee80211_sdata_running(sdata))
|
||||
return -ENETDOWN;
|
||||
|
||||
if (local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL) {
|
||||
ret = drv_set_bitrate_mask(local, sdata, mask);
|
||||
if (ret)
|
||||
|
@ -1352,6 +1352,8 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
|
||||
if (WARN_ON(!ifmgd->associated))
|
||||
return;
|
||||
|
||||
ieee80211_stop_poll(sdata);
|
||||
|
||||
memcpy(bssid, ifmgd->associated->bssid, ETH_ALEN);
|
||||
|
||||
ifmgd->associated = NULL;
|
||||
@ -2612,8 +2614,6 @@ static void ieee80211_sta_connection_lost(struct ieee80211_sub_if_data *sdata,
|
||||
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
|
||||
u8 frame_buf[DEAUTH_DISASSOC_LEN];
|
||||
|
||||
ieee80211_stop_poll(sdata);
|
||||
|
||||
ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, reason,
|
||||
false, frame_buf);
|
||||
mutex_unlock(&ifmgd->mtx);
|
||||
|
@ -271,6 +271,9 @@ struct sta_ampdu_mlme {
|
||||
* @plink_timer: peer link watch timer
|
||||
* @plink_timer_was_running: used by suspend/resume to restore timers
|
||||
* @t_offset: timing offset relative to this host
|
||||
* @t_offset_setpoint: reference timing offset of this sta to be used when
|
||||
* calculating clockdrift
|
||||
* @ch_type: peer's channel type
|
||||
* @debugfs: debug filesystem info
|
||||
* @dead: set to true when sta is unlinked
|
||||
* @uploaded: set to true when sta is uploaded to the driver
|
||||
@ -278,6 +281,8 @@ struct sta_ampdu_mlme {
|
||||
* @sta: station information we share with the driver
|
||||
* @sta_state: duplicates information about station state (for debug)
|
||||
* @beacon_loss_count: number of times beacon loss has triggered
|
||||
* @supports_40mhz: tracks whether the station advertised 40 MHz support
|
||||
* as we overwrite its HT parameters with the currently used value
|
||||
*/
|
||||
struct sta_info {
|
||||
/* General information, mostly static */
|
||||
|
@ -83,9 +83,10 @@ netdev_tx_t mac802154_tx(struct mac802154_priv *priv, struct sk_buff *skb,
|
||||
{
|
||||
struct xmit_work *work;
|
||||
|
||||
if (!(priv->phy->channels_supported[page] & (1 << chan)))
|
||||
if (!(priv->phy->channels_supported[page] & (1 << chan))) {
|
||||
WARN_ON(1);
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
if (!(priv->hw.flags & IEEE802154_HW_OMIT_CKSUM)) {
|
||||
u16 crc = crc_ccitt(0, skb->data, skb->len);
|
||||
|
@ -5,8 +5,8 @@
|
||||
*
|
||||
* Copyright (C) 2008 Nokia Corporation.
|
||||
*
|
||||
* Contact: Remi Denis-Courmont <remi.denis-courmont@nokia.com>
|
||||
* Original author: Sakari Ailus <sakari.ailus@nokia.com>
|
||||
* Authors: Sakari Ailus <sakari.ailus@nokia.com>
|
||||
* Rémi Denis-Courmont
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
@ -5,8 +5,8 @@
|
||||
*
|
||||
* Copyright (C) 2008 Nokia Corporation.
|
||||
*
|
||||
* Contact: Remi Denis-Courmont <remi.denis-courmont@nokia.com>
|
||||
* Original author: Sakari Ailus <sakari.ailus@nokia.com>
|
||||
* Authors: Sakari Ailus <sakari.ailus@nokia.com>
|
||||
* Rémi Denis-Courmont
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
@ -5,7 +5,7 @@
|
||||
*
|
||||
* Copyright (C) 2008 Nokia Corporation.
|
||||
*
|
||||
* Author: Rémi Denis-Courmont <remi.denis-courmont@nokia.com>
|
||||
* Author: Rémi Denis-Courmont
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
@ -5,7 +5,7 @@
|
||||
*
|
||||
* Copyright (C) 2008 Nokia Corporation.
|
||||
*
|
||||
* Author: Rémi Denis-Courmont <remi.denis-courmont@nokia.com>
|
||||
* Author: Rémi Denis-Courmont
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
@ -5,8 +5,8 @@
|
||||
*
|
||||
* Copyright (C) 2008 Nokia Corporation.
|
||||
*
|
||||
* Contact: Remi Denis-Courmont <remi.denis-courmont@nokia.com>
|
||||
* Original author: Sakari Ailus <sakari.ailus@nokia.com>
|
||||
* Authors: Sakari Ailus <sakari.ailus@nokia.com>
|
||||
* Rémi Denis-Courmont
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
@ -5,8 +5,8 @@
|
||||
*
|
||||
* Copyright (C) 2008 Nokia Corporation.
|
||||
*
|
||||
* Contact: Remi Denis-Courmont <remi.denis-courmont@nokia.com>
|
||||
* Original author: Sakari Ailus <sakari.ailus@nokia.com>
|
||||
* Authors: Sakari Ailus <sakari.ailus@nokia.com>
|
||||
* Remi Denis-Courmont
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
@ -5,8 +5,8 @@
|
||||
*
|
||||
* Copyright (C) 2008 Nokia Corporation.
|
||||
*
|
||||
* Contact: Remi Denis-Courmont <remi.denis-courmont@nokia.com>
|
||||
* Original author: Sakari Ailus <sakari.ailus@nokia.com>
|
||||
* Authors: Sakari Ailus <sakari.ailus@nokia.com>
|
||||
* Rémi Denis-Courmont
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
@ -5,7 +5,7 @@
|
||||
*
|
||||
* Copyright (C) 2008 Nokia Corporation.
|
||||
*
|
||||
* Contact: Remi Denis-Courmont <remi.denis-courmont@nokia.com>
|
||||
* Author: Rémi Denis-Courmont
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
@ -673,7 +673,9 @@ void sctp_addr_wq_timeout_handler(unsigned long arg)
|
||||
SCTP_DEBUG_PRINTK("sctp_addrwq_timo_handler: sctp_asconf_mgmt failed\n");
|
||||
sctp_bh_unlock_sock(sk);
|
||||
}
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
free_next:
|
||||
#endif
|
||||
list_del(&addrw->list);
|
||||
kfree(addrw);
|
||||
}
|
||||
|
@ -1389,7 +1389,7 @@ static void reg_set_request_processed(void)
|
||||
spin_unlock(®_requests_lock);
|
||||
|
||||
if (last_request->initiator == NL80211_REGDOM_SET_BY_USER)
|
||||
cancel_delayed_work_sync(®_timeout);
|
||||
cancel_delayed_work(®_timeout);
|
||||
|
||||
if (need_more_processing)
|
||||
schedule_work(®_work);
|
||||
|
@ -804,7 +804,7 @@ int cfg80211_change_iface(struct cfg80211_registered_device *rdev,
|
||||
ntype == NL80211_IFTYPE_P2P_CLIENT))
|
||||
return -EBUSY;
|
||||
|
||||
if (ntype != otype) {
|
||||
if (ntype != otype && netif_running(dev)) {
|
||||
err = cfg80211_can_change_interface(rdev, dev->ieee80211_ptr,
|
||||
ntype);
|
||||
if (err)
|
||||
|
Loading…
Reference in New Issue
Block a user